2013-09-16 5 views
1

Как я могу вставить новый объект в Mongo и получить _id с вставленным документом?Вставка объекта в Mongo с выходом _id

Желаемая поведение:

val _id: String = coll.insert(someObj) // _id = "_id" вставленного док

+0

многие драйверы устанавливают '_id 'документа, который вы вставили. – WiredPrairie

+0

Не могли бы вы указать мне на «Касбаху»? –

+0

Попробуйте MongoDBObject.get ("_ id"), может работать. –

ответ

4

Вам не нужно искать. Когда вы вставляете новый объект, его идентификатор создается на стороне клиента , это означает, что вы уже знаете его перед отправкой.

Отсюда: http://docs.mongodb.org/manual/reference/object-id/

ObjectId представляет собой тип BSON 12 байт, построено с использованием:

значение 4 байта, представляющее секунд с началом эпохи Unix, идентификатора машины 3-байтовой , 2-байтовый идентификатор процесса и 3-байтовый счетчик, начиная со случайного значения.

Итак, при запросе на вставку нового документа вы укажете его уже. Обычно вы либо используете существующий идентификатор, либо генерируете новый, используя BSONObjectID.generate.

Вот быстрый проект, используя пользовательский класс для отображения (в этом примере я использовал reactivemongo, не Casbah):

case class Account(
    id: Option[BSONObjectID], 
    firstName: String, 
    lastName: String) 

А потом сделать следующее в записывающем:

implicit object AccountBSONWriter extends BSONDocumentWriter[Account] { 
    def write(account: Account): BSONDocument = 
    BSONDocument(
     "_id" -> account.id.getOrElse(BSONObjectID.generate), 
     "first_name" -> account.firstName, 
     "last_name" -> account.lastName) 
} 
+0

Но если он сгенерирован на стороне клиента, то это * возможно * создать не уникальное значение, не так ли? –

+0

Это правильно. GUID и другие UNIQUE-идентификаторы никогда не являются уникальными, они используют Mac-адрес, например, для генерации уникального идентификатора, однако, если кто-то устанавливает тот же Mac, то вы можете иметь такое же значение. Однако они также используют время, дату и т. Д. Это делает практически невозможным не уникальность. То же самое для MongoDB, вероятность того, что у вас будет идентичное оборудование в вашем кластере, крайне редко, если не невозможно. Мне нужно будет изучить их исходный код, чтобы найти то, что именно они используют в качестве идентификатора машины, но я думаю, что это довольно надёжно. Есть сайты с миллиардами записей ... –

Смежные вопросы