2013-04-10 60 views
1

我注意到,可以使用字符串或對象ID來構造mongodb中的DBRef。例如mongodb - 使用字符串或ObjectId構造DBRef

db.persons.insert({name: 'alice'}) 
db.persons.find() 
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" } 
db.persons.insert({name: 'bob', sister: new DBRef('persons', '5165419064fada69cef33ea2')}) // use a string 
db.persons.find() 
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" } 
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } } 
db.persons.insert({name: 'cavin', sister: new DBRef('persons', new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId 
db.persons.find() 
// { "_id" : ObjectId("5165419064fada69cef33ea2"), "name" : "alice" } 
// { "_id" : ObjectId("516541c064fada69cef33ea3"), "name" : "bob", "sister" : { "$ref" : "persons", "$id" : "5165419064fada69cef33ea2" } } 
// { "_id" : ObjectId("516541e464fada69cef33ea4"), "name" : "cavin", "sister" : { "$ref" : "persons", "$id" : ObjectId("5165419064fada69cef33ea2") } } 

有誰告訴我有什麼區別和方法是首選?

回答

2

唯一的區別是其中一個實際上是ObjectId而另一個是看起來是ObjectId的字符串表示。

DBREF作爲的ObjectId:

db.persons.insert({name: 'cavin', 
    sister: new DBRef('persons', 
     new ObjectId('5165419064fada69cef33ea2'))}) // use an ObjectId 

DBREF作爲字符串:

db.persons.insert({name: 'bob', 
    sister: new DBRef('persons', 
     '5165419064fada69cef33ea2')}) // use a string 

在你包括的示例中,ObjectId格式可能會導致更有效的存儲,因爲它是一個12字節的值而不是字符串表示需要的24個字節。如果您想使用DBRef s,如果引用的集合使用ObjectId s作爲_id,我會使用ObjectId

您不需要在DBRef中使用ObjectId。它可以是代表相關收集/數據庫的密鑰(_id)的任何值。

隨着documentation建議,除非你有使用DBRef一個令人信服的理由,使用說明書引用來代替。

0

的ObjectId優點

  • 它在其中具有嵌入的時間戳。

  • 它是默認的Mongo _id類型;與其他應用程序和驅動程序

的ObjectId缺點

  • 無處不

  • 互通它是一個對象,而多了幾分難以在實踐中操作。

  • 會有當你忘記來包裝你的字符串在新的ObjectId()倍

  • 它需要服務器端對象創建維護_id獨特

  • 這使得通過minimongo生成它們的客戶端問題

字符串優點

  • 開發人員可以創建域特定_id拓撲

字符串缺點

  • 顯影劑必須確保_ids的唯一性

  • findAndModify()和getNextSequence()的查詢可以是無效