Автоматическое увеличение в MongoDB для сохранения последовательности уникального идентификатора пользователя - PullRequest
19 голосов
/ 05 декабря 2011

Я создаю аналитическую систему, вызов API предоставит уникальный идентификатор пользователя, но он не является последовательным и слишком разреженным.

Мне нужно присвоить каждому уникальному идентификатору пользователя автоматический идентификатор приращения, чтобы отметитьаналитические данные назначаются в битаррай / битсет.Таким образом, первый пользователь встречается с первым битом массива, второй пользователь будет вторым битом массива и т. Д.

Таким образом, существует надежный и быстрый способ создания дополнительных уникальных идентификаторов пользователей в MongoDB

Ответы [ 4 ]

18 голосов
/ 21 января 2013

Поскольку выбранный ответ говорит, что вы можете использовать findAndModify для генерации последовательных идентификаторов.

Но я категорически не согласен с мнением, что вы не должны этого делать. Все зависит от потребностей вашего бизнеса. Наличие 12-байтового идентификатора может быть очень ресурсоемким и вызывать значительные проблемы с масштабируемостью в будущем.

У меня есть подробный ответ здесь .

12 голосов
/ 05 декабря 2011

Вы можете, но не должны https://web.archive.org/web/20151009224806/http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

Каждый объект в Монго уже имеет идентификатор, и они сортируются в порядке вставки.Что плохого в получении коллекции пользовательских объектов, итерации по ней и использовании в качестве увеличенного идентификатора?Э-э ... иди на работу по сокращению карт целиком

7 голосов
/ 29 апреля 2017

Я знаю, что это старый вопрос, но я опубликую свой ответ для потомков ...

Это зависит от системы, которую вы строите, и от конкретных бизнес-правил на месте.

Я создаю CRM среднего и крупного масштаба в MongoDb, C # (Backend API) и Angular (веб-приложение Frontend) и обнаружил, что ObjectId крайне ужасен для использования в угловой маршрутизации для выбора определенных объектов.То же самое с маршрутизацией API-контроллера.

Вышеприведенное предложение отлично сработало для моего проекта.

db.contacts.insert({
 "id":db.contacts.find().Count()+1,
 "name":"John Doe",
 "emails":[
    "john@doe.com",
    "john.doe@business.com"
 ],
 "phone":"555111322",
 "status":"Active"
});

Причина, по которой он идеально подходит для моего случая, но не во всех случаях заключается в том, что, как указано в приведенном выше комментарии, если вы удалите 3 записи из коллекции, вы получите коллизии.

Мои бизнес-правила гласят, что из-за наших внутренних соглашений об уровне обслуживания нам не разрешается удалять данные корреспонденции или записи клиентов дольше, чем потенциальная продолжительность жизни приложения, которое я пишу, и поэтому я просто отмечаю записис перечислением «Status», которое является «Active» или «Deleted».Вы можете удалить что-то из пользовательского интерфейса, и он скажет «Контакт был удален», но все, что приложение сделало, это изменило статус контакта на «Удален», и когда приложение вызывает репозиторий для списка контактов, я фильтруюудалить удаленные записи перед отправкой данных в клиентское приложение.

Следовательно, db.collection.find (). Count () + 1 - идеальное решение для меня ...

Это не будет работать для всех, но если вы не будетеудаляя данные, все работает нормально.

0 голосов
/ 03 января 2019

Первая запись должна быть добавлена ​​

"_id" = 1    in your db

$database = "demo";
$collections ="democollaction";
echo getnextid($database,$collections);

function getnextid($database,$collections){

     $m = new MongoClient();
    $db = $m->selectDB($database);
    $cursor = $collection->find()->sort(array("_id" => -1))->limit(1);
    $array = iterator_to_array($cursor);

    foreach($array as $value){



        return $value["_id"] + 1;

    }
 }
...