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

Posted

技术标签:

【中文标题】如何为 MongoDB 中的嵌入式文档创建唯一 ID?【英文标题】:How can I create unique IDs for embedded documents in MongoDB? 【发布时间】:2012-04-26 01:19:13 【问题描述】:

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

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

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

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

【问题讨论】:

如果你使用 Guid 就不会 【参考方案1】:

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

from bson.objectid import ObjectId

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

【讨论】:

您不需要为此创建 lambda:ObjectIdField(required=True, default=ObjectId) 就可以了。 没错,谢谢【参考方案2】:

这就是你在 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())

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

在 Meteor 的服务器上,使用:

new Meteor.Collection.ObjectID(hexString);

见:http://docs.meteor.com/#collection_object_id

【讨论】:

【参考方案5】:

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

在 shell 中你只需要new ObjectId():

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

在 Java 中也是 new ObjectId()。请参阅您的驱动程序的 API 文档以了解具体语法。

【讨论】:

【参考方案6】:

是的,使用 mongo 的 ObjectId 是要走的路。唯一的事情是:您必须在应用程序代码中自己生成它们。它们应该是全局唯一的,不同的 worker 不会生成两个相同的 ObjectId,因此在这个意义上不存在竞争条件。

所有官方驱动都应该提供生成 ObjectId 的方法。下面是它在 Ruby 中的表现:

oid = BSON::ObjectId.new

【讨论】:

@PiniCheyni 像这样:new ObjectId()

以上是关于如何为 MongoDB 中的嵌入式文档创建唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin 数据类:如何为嵌入式文档生成 MongoDB ObjectId

如何为子文档创建 mongoDb 架构

如何为 MongoDB 集合中的所有文档选择单个字段?

MongoDB:如何为集合中的每个文档设置一个等于另一个字段值的新字段[重复]

如何为嵌入文件编写mongo查询

如何为 Cosmos DB 集合中的列创建唯一键?