如何在MongoDB中为嵌入式文档创建唯一ID?

时间:2012-04-13 16:39:06

标签: mongodb

所以我需要从我的集合中的项目中唯一地引用特定的子文档。例如:

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

所以我需要能够为新文档自动创建ID,最好不要在应用程序级别(因为实际开发场景中会有竞争条件)。

有没有办法使用mongo的自动生成的ObjectId(在集合级别的_id字段中使用)或类似的东西?

6 个答案:

答案 0 :(得分:21)

是的,使用mongo的ObjectId是可行的方法。唯一的事情是:你必须在应用程序代码中自己生成它们。它们是全球唯一的,不同的工人不会生成两个相同的ObjectIds,因此在这个意义上没有竞争条件。

所有官方驱动程序都应提供生成ObjectId的方法。以下是Ruby中的内容:

oid = BSON::ObjectId.new

答案 1 :(得分:9)

所有驱动程序都具有生成ObjectIds的功能。

在shell中你只需new ObjectId()

> db.test.insert({x:new ObjectId()});
> db.test.find();
{ "_id" : ObjectId("4f88592a06c05e4de90d0bc1"), "x" : ObjectId("4f88592a06c05e4de90d0bc0") }

在Java中它也是new ObjectId()。请参阅驱动程序的API文档以查看特定语法。

答案 2 :(得分:6)

使用 mongoengine 在嵌入式文档中创建一个ObjectId,如下所示:

from bson.objectid import ObjectId

class Address(EmbeddedDocument):
    _id = ObjectIdField( required=True, default=lambda: ObjectId() )
    street = StringField()

答案 3 :(得分:3)

在Meteor中,在服务器上,使用:

new Meteor.Collection.ObjectID(hexString);

请参阅:http://docs.meteor.com/#collection_object_id

答案 4 :(得分:0)

以下是如何在Clojure中做到这一点,假设使用congomongo:

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

答案 5 :(得分:0)

这就是你在python(pymongo)中的表现:

from pymongo import MongoClient
import bson

client = MongoClient('mongodb://localhost:27017/')
db = client.test_db

result=db.users.insert_one({'name': 'jim',
    'documents': [
        {'_id': bson.objectid.ObjectId(), 'title': "My document"},
        {'_id': bson.objectid.ObjectId(), 'title': "My second document!"},
    ]})

print list(db.users.find({}))