2012-01-03 64 views
0

我有一些麻煩與DBREF,看看這種情況:的MongoDB - DBREF

db.fruit.save ({"_id" : "1" , "name" : "apple"}); 
db.fruit.save ({"_id" : "2" , "name" : "grape"}); 
db.fruit.save ({"_id" : "3" , "name" : "orange"}); 
db.fruit.save ({"_id" : "4" , "name" : "pineapple"}); 

db.basket.save ({"_id" : "1", "items" : [ 
    {"$ref" : "fruit", "$id" : "1", "quantity" : 5}, 
    {"$ref" : "fruit", "$id" : "3", "quantity" : 10} 
]}) 

現在,讓我們找到了 「菜籃子」 集合:

> db.basket.find() 
{ "_id" : "1", "items" : [ 
    { 
     "$ref" : "fruit", 
     "$id" : "1" 
    }, 
    { 
     "$ref" : "fruit", 
     "$id" : "3" 
    } 
] } 

「量」 屬性消失了?!任何人都知道爲什麼?有其他選擇嗎?

謝謝。

回答

8

的語法dbref

{ $ref : <collname>, $id : <idvalue>[, $db : <dbname>] } 

但你已經添加內部DBREF不支持的數量字段。那就是問題所在。採取外

db.basket.save ({"_id" : "1", "items" : [ 
    {"quantity" : 5 , item : {"$ref" : "fruit", "$id" : "1"}}, 
    {"quantity" : 10, item : {"$ref" : "fruit", "$id" : "3"}} 
]}) 

哪種相貌(嚇人)

{ 
    "_id" : "1", 
    "items" : [ 
     { 
      "quantity" : 5, 
      "item" : { 
       "$ref" : "fruit", 
       "$id" : "1" 
      } 
     }, 
     { 
      "quantity" : 10, 
      "item" : { 
       "$ref" : "fruit", 
       "$id" : "3" 
      } 
     } 
    ] 
} 

但我的建議是,共溝DBREF,只是用簡單的結構是這樣

db.basket.save ({"_id" : "1",items:[ 
         {item_id:"1",quantity:50}, 
         {item_id:"3",quantity:10} 
       ]}) 

這是更清潔,看起來像

{ 
    "_id" : "1", 
    "items" : [ 
     { 
      "item_id" : "1", 
      "quantity" : 50 
     }, 
     { 
      "item_id" : "3", 
      "quantity" : 10 
     } 
    ] 
} 
+1

但用最後一種方法,我如何獲取所有項目數據,如加入? – jtomasrl 2012-11-08 15:12:19

+1

MongoDb中沒有加入 – 2012-11-15 13:10:31

+1

只是爲了說明,DBRef中支持其他字段,因爲它實際上只是一個BSON對象;然而,MongoDB shell在渲染值時隱藏了除'$ ref','$ id'和可選的'$ db'字段之外的字段。一些ODM實際上將附加值存儲在DBRef對象中(Doctrine使用類鑑別符值執行此操作)。也就是說,如果您始終引用同一個數據庫和集合中的對象,那麼在沒有DBRef的情況下,您肯定會更好,因爲在這種情況下'$ ref'和'$ db'沒有用處。 – jmikola 2014-09-11 17:05:54