Подтвердить что ты не робот

Как создать уникальные идентификаторы для встроенных документов в MongoDB?

Поэтому мне нужно однозначно ссылаться на отдельные поддокументы из элементов моей коллекции. Например:

User = {
    'name': 'jim',
    'documents: [
        {'id': 0001, 'title': "My document"},
        {'id': 0002, 'title': "My second document!"},
    ]
}

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

Есть ли способ использовать mongo autogenerated ObjectId (используемый в поле _id на уровне коллекции) или что-то подобное?

4b9b3361

Ответ 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()

Ответ 5

И вот как это сделать в Clojure, предполагая использование congomongo:

(import org.bson.types.ObjectId)
(str (ObjectId.)) ; => "12345xxxxx"