如何为 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