2012-04-13 160 views
26

所以我需要从我的集合中的项目中唯一引用特定的子文档。例如:如何在MongoDB中为嵌入文档创建唯一ID?

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

所以我需要能够自动创建新文档的ID,最好不要在应用级(因为会出现在实际的开发场景的比赛条件)。

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

+1

如果您使用Guid,则不会有 – 2012-04-13 16:40:42

回答

19

是的,使用mongo的ObjectId是要走的路。唯一的问题是:您必须自己在应用程序代码中生成它们。它们意味着全球独一无二,不同的工作人员不会生成两个相同的ObjectId,因此在这种意义上没有竞争条件。

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

oid = BSON::ObjectId.new 
+0

您是否知道如何使用mongo CLI执行此操作? – 2017-01-20 18:54:20

+2

@PiniCheyni像这样:'new ObjectId()' – Clouren 2017-02-17 14:02:52

9

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

在外壳里,你只是做new ObjectId()

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

在Java它new ObjectId()为好。查看驱动程序的API文档以查看特定的语法。

0

下面是如何做到这一点Clojure中,假设使用congomongo的:

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

随着mongoengine像这样在嵌入式文档中创建ObjectId:

from bson.objectid import ObjectId 

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

'default = ObjectId' should also work – 2017-07-10 10:24:45

相关问题