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

Dan*_*Dan 31 mongodb

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

User = {
    'name': 'jim',
    'documents: [
        {'id': 0001, 'title': "My document"},
        {'id': 0002, 'title': "My second document!"},
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ser*_*sev 23

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

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

oid = BSON::ObjectId.new
Run Code Online (Sandbox Code Playgroud)

  • @PiniCheyni像这样:`new ObjectId()` (2认同)

Eve*_*man 9

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

在你刚刚做的shell中new ObjectId():

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

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


JFa*_*thi 6

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

from bson.objectid import ObjectId

class Address(EmbeddedDocument):
    _id = ObjectIdField( required=True, default=lambda: ObjectId() )
    street = StringField()
Run Code Online (Sandbox Code Playgroud)