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

如何为MongoDB中的嵌入文档创建唯一ID?,mongodb,Mongodb,因此,我需要从集合中的项目中唯一地引用特定的子文档。例如: User = { 'name': 'jim', 'documents: [ {'id': 0001, 'title': "My document"}, {'id': 0002, 'title': "My second document!"}, ] } 因此,我需要能够为新文档自动创建ID,最好不要在应用程序级别(因为在实际开发场景中会有竞争条件) 有没有一种方法可以使用mongo

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

User = {
    'name': 'jim',
    'documents: [
        {'id': 0001, 'title': "My document"},
        {'id': 0002, 'title': "My second document!"},
    ]
}
因此,我需要能够为新文档自动创建ID,最好不要在应用程序级别(因为在实际开发场景中会有竞争条件)


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

是的,使用mongo的ObjectId是一种方法。唯一的问题是:您必须自己在应用程序代码中生成它们。它们应该是全局唯一的,不同的工作者不会生成两个相同的objectid,所以在这个意义上不存在种族条件

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

oid = BSON::ObjectId.new

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

在shell中,只需执行
newobjectid()


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

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

new Meteor.Collection.ObjectID(hexString);

请参阅:

,假设使用congomongo,下面介绍如何在Clojure中执行此操作:

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

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

from bson.objectid import ObjectId

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

这是在python(pymongo)中实现的方法:


如果您使用Guid,则不会出现这种情况t@PiniCheyni如下所示:
newobjectid()
from bson.objectid import ObjectId

class Address(EmbeddedDocument):
    _id = ObjectIdField( required=True, default=lambda: ObjectId() )
    street = StringField()
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({}))