我想在我的应用程序中使用mongo,当我在考虑设计问题时,我提出了问题,那么DBRef的优点/目的是什么?
例如:
> names = ['apple', 'banana', 'orange', 'peach', 'pineapple']
[ "apple", "banana", "orange", "peach", "pineapple" ]
> for (i=0; i<5; i++) {
... db.fruits.insert({_id:i, name:names[i]})
... }
> db.fruits.find()
{ "_id" : 0, "name" : "apple" }
{ "_id" : 1, "name" : "banana" }
{ "_id" : 2, "name" : "orange" }
{ "_id" : 3, "name" : "peach" }
{ "_id" : 4, "name" : "pineapple" }
我希望将这些水果存放在一个篮子系列中:
> db.basket.insert({_id:1, items:[ {$ref:'fruits', $id:1}, {$ref:'fruits', $id:3} ] })
> db.basket.insert({_id:2, items:[{fruit_id: 1}, {fruit_id: 3}]})
> db.basket.find()
{ "_id" : 1, "items" : [ DBRef("fruits", 1), DBRef("fruits", 3) ] }
{ "_id" : 2, "items" : [ { "fruit_id" : 1 }, { "fruit_id" : 3 } ] }
这两种技术之间有什么真正的区别?对我来说,看起来像使用DBRef你只需插入更多数据而没有任何好处....如果我错了请纠正我。
答案 0 :(得分:5)
基本上DBRef是一个自我描述的ObjectID,客户端帮助程序存在于所有驱动程序中(我认为都是),它使您的应用程序能够轻松获取相关行。
他们不是:
它们也没有在Map Reduce中使用,由于分片的复杂性,功能被取消了。
使用它们并不总是很好,但是如果你知道与该行相关的集合与仅存储ObjectID相比,它们占用了相当多的空间。不仅如此,而且由于它们的解析方式,每个相关记录需要逐个延迟加载,如果能够形成一个范围(轻松)一次查询相关行,那么它们可以增加查询量你也可以使用数据库,反过来增加游标。
答案 1 :(得分:4)
来自“MongoDB:权威指南”DBRef不是必需的,存储MongoID更轻量级,但DBRefs提供了一些有趣的功能,如下所示:
将每个DBRef加载到文档中:
var note = db.notes.findOne({"_id":20});
note.references.forEach(function(ref) {
printjson(db[ref.$ref].findOne({"_id": ref.$id}));
});
如果引用存储在不同的集合和数据库中,它们也很有用,因为DBRef包含该信息。如果你使用MongoID,你必须记住MongoID所引用的数据库和集合。
在您的示例中,购物篮文档的items数组可能包含水果集合中的引用,但也包含蔬菜收集。在这种情况下,DBRef实际上很方便。