Помощь с MongoDB и генерация уникального идентификатора - PullRequest
2 голосов
/ 16 сентября 2011

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

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

Спасибо

Ответы [ 2 ]

6 голосов
/ 16 сентября 2011

Это довольно просто сделать. За исключением операций upsert, ObjectId генерируется на стороне клиента. Другими словами, когда вы выполняете операцию сохранения из вашего приложения, драйвер автоматически выполняет (псевдо):

if(!doc.containsKey("_id"))
    doc.put(_id, new ObjectId());

Итак, все, что вам нужно сделать, - это сгенерировать ObjectId самостоятельно, делать с ним все, что вам нужно, а затем установить _id вашего документа на это значение, а не делать так, чтобы драйвер монго делал это за вас.

Обратите внимание, что это точно так же безопасно, как если бы драйвер сгенерировал идентификаторы. ObjectIds предназначены для устранения столкновений идентификаторов (читай: маловероятно, что столкновения станут бесполезными). Кроме того, время между генерацией идентификатора и его сохранением также не вызывает проблем с конфликтом идентификаторов.

Если вы сохраните документ с _id, который уже существует в базе данных, он перезапишет исходный документ с этим _id.

Если вы вставите документ с уже существующим _id, вы получите дубликат ошибки _id (ошибка 11000).

1 голос
/ 16 сентября 2011

Вам не нужно использовать Bson ObjectIds в качестве идентификаторов в вашей базе данных (см. http://www.mongodb.org/display/DOCS/Object+IDs).Вы можете создавать свои собственные.Драйвер C # предоставляет способ генерировать ObjectIds на стороне клиента.Какой драйвер javascript вы используете для вызова MongoDB?Разве у него нет вызова для создания нового ObjectId?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...