37

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

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

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

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

4

6 回答 6

29

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

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

oid = BSON::ObjectId.new
于 2012-04-13T16:51:01.577 回答
11

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

在外壳中,您只需执行以下操作new ObjectId()

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

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

于 2012-04-13T16:51:31.603 回答
8

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

from bson.objectid import ObjectId

class Address(EmbeddedDocument):
    _id = ObjectIdField( required=True, default=ObjectId )
    street = StringField()
于 2015-12-07T09:17:10.580 回答
3

在 Meteor 的服务器上,使用:

new Meteor.Collection.ObjectID(hexString);

请参阅:http ://docs.meteor.com/#collection_object_id

于 2013-08-25T06:00:12.253 回答
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({}))
于 2018-06-06T22:27:32.903 回答
0

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

(import org.bson.types.ObjectId)
(str (ObjectId.)) ; => "12345xxxxx"
于 2014-07-22T12:00:23.840 回答