2012-04-13 162 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

相關問題