DBRef就像url,唯一确定一个到文档的引用.它自动加载文档的方式就像网站中url通过链接自动加载web页面一样.
a.DBRef是什么
DBRef是一个内嵌文档,DBRef有些必选键,如:
{"$ref":collectionName,"$id":id_value}
DBRef指向一个集合,还有一个id_value用来在集合里面根据"_id"确定唯一的文档.这两条信息可以使DBRef能
唯一标识MongoDB数据库内的任何一个文档.如想引用另一个数据库的文档,DBRef中有可选键"$db"
{"$ref":collectionName,"$id":id_value,"$db":database}//注意键的顺序不能改变.
b.实例
两个集合 users(用户),notes(笔记),
用户可以创建笔记,笔记可以引用用户或者别的笔记.
db.users.insert({"_id":"refactor","displayName":"dis_refactor"})
db.users.insert({"_id":"refactor2","displayName":"dis_refactor2"})
db.notes.insert({"_id":2,"author":"refactor","text":"refactor in mongodb"})
db.notes.insert(
{
"_id":22,
"author":"refactor22",
"text":"...DBRef likes url",
"references":
[
{"$ref":"users","$id":"refactor"},
{"$ref":"notes","$id":2}
]
}
)
var note=db.notes.findOne({"_id":22});
note.references.forEach(
function(ref){
printjson(db[ref.$ref].findOne({"_id":ref.$id}));
});
c.什么时候使用DBRef
在MongoDB中表示这种对其他文档的引用关系,并不是只有DBRef方式.
上面的例子就用了另外一种引用:每个note的author键仅存储了author文档的"_id"键,没有必要用DBRef,因为已经
知道每个author就是users集合里面的一个文档.这种引用在GridFS的块文档中"files_id"键仅仅就是对文档"_id"的引用.
在保存引用的时候是选择DBRef还是至存储"_id"?
保存"_id"会更加紧凑,对开发者而言就很轻量.但是DBRef能够引用任意集合(甚至是任意数据库)的文档,开发者
不必知道和记住被引用的文档在哪些集合里面.驱动程序和一些工具对DBRef提供了额外的功能(如自动去引用).
总之,存储一些对 不同 集合的 文档的引用时,最好用DBRef.否则最好存储"_id"作为引用来使用,这样更简单,也更容易操作.
DBRef 在JAVA中的引用:例子简单,网上找的,继续搜集好的例子
<pre name="code" class="java">DBObject obj = transactions.findOne(new BasicDBObject("state", "done") );
System.out.println(obj.toString());
List<DBRef> listRef = new ArrayList<DBRef>();
DBRef refB = new DBRef(db,"transations", obj.get("_id"));
listRef.add(refB);
DBObject subObj = new BasicDBObject();
subObj.put("brand", refB);
subObj.put("productList", listRef);
subObj.put("balance", "2000");
subObj.put("pendingTransactions", new Array[0]);
accounts.save(subObj);