【问题标题】:How can I create unique IDs for embedded documents in MongoDB?如何为 MongoDB 中的嵌入式文档创建唯一 ID?
【发布时间】: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 就不会

标签: mongodb


【解决方案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()
          猜你喜欢
          • 2020-12-27
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2021-09-03
          • 1970-01-01
          • 2022-11-29
          • 2016-11-12
          • 1970-01-01
          相关资源
          最近更新 更多