2012-01-03 65 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