mongodb数据库引用DBRef

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);

 
  
 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值