Как создать уникальные идентификаторы для встроенных документов в MongoDB?
Поэтому мне нужно однозначно ссылаться на отдельные поддокументы из элементов моей коллекции. Например:
User = {
'name': 'jim',
'documents: [
{'id': 0001, 'title': "My document"},
{'id': 0002, 'title': "My second document!"},
]
}
Поэтому мне нужно иметь возможность автоматически создавать идентификаторы для новых документов, желательно не на уровне приложений (поскольку в сценарии фактического развития будут условия гонки).
Есть ли способ использовать mongo autogenerated ObjectId (используемый в поле _id на уровне коллекции) или что-то подобное?
Ответы
Ответ 1
Да, использование mongo ObjectId - путь. Единственное: вы должны генерировать их самостоятельно, в коде приложения. Они должны быть глобально уникальными, разные работники не будут генерировать два идентичных объекта ObjectIds, поэтому в этом смысле нет условий гонки.
Все официальные драйверы должны предоставить способ создания ObjectId. Вот как это делается в Ruby:
oid = BSON::ObjectId.new
Ответ 2
Все драйверы имеют функциональные возможности для создания ObjectIds.
В оболочке вы просто new ObjectId()
:
> db.test.insert({x:new ObjectId()});
> db.test.find();
{ "_id" : ObjectId("4f88592a06c05e4de90d0bc1"), "x" : ObjectId("4f88592a06c05e4de90d0bc0") }
В Java это также new ObjectId()
. Обратитесь к документам API для вашего драйвера, чтобы увидеть конкретный синтаксис.
Ответ 3
С mongoengine создайте ObjectId во встроенном документе следующим образом:
from bson.objectid import ObjectId
class Address(EmbeddedDocument):
_id = ObjectIdField( required=True, default=lambda: ObjectId() )
street = StringField()
Ответ 4
В Meteor на сервере используйте:
new Meteor.Collection.ObjectID(hexString);
Смотрите: http://docs.meteor.com/#collection_object_id
Ответ 5
И вот как это сделать в Clojure, предполагая использование congomongo:
(import org.bson.types.ObjectId)
(str (ObjectId.)) ; => "12345xxxxx"