使用java获取文档时,在mongo查询中传递DBRef

时间:2013-10-11 10:33:19

标签: java mongodb mongodb-java mongo-java dbref

 db.collectionB.findOne()
 {
    "_id" : NumberLong(24),
    "class" : "Top",
    "type" : DBRef("collectionA", NumberLong(47))
 }
db.collectionA.findOne()
{
   "_id" : NumberLong(47),
   "name" : "John",
   "position" : 2 
}

要形成的QUERY:db.collectionB.find({type:DBRef(“collectionA”,NumberLong(47))});

A& A收集了很多文件。 collectionB。我想搜索collectionB中“type”所指的文档,其中“_id”是collectionA中的NumberLong(47)。

BasicDBObject query =   new BasicDBObject("name","John");
DBObject db_object = findOne("collectionA",query);
DBRef myDbRef = new DBRef(db,"collectionB",db_object); 
DBObject doc = myDbRef.fetch(); 
System.out.println(doc);

它给输出null。为什么呢?

1 个答案:

答案 0 :(得分:3)

3-argument constructor of DBRef采用以下参数:

  • 数据库
  • 命名空间
  • ID

你的第二个参数不是命名空间,它只是集合。它应该是一个字符串"yourDatabaseName.collectionB"

你的第三个参数不只是一个ID,它是一个完整的对象。这样,DBRef指向一个文档,其中字段_id 的值是您传递的文档的完整副本。这样的文档不存在,因此获取DBRef将返回null。

要创建有效的DBRef,只需将_id的值传递给DBRef的构造函数。

但是,当我理解你的要求时“我想搜索其中”typeB中的“type”指的文件,其中“_id”是collectionA中的NumberLong(47)。“没错,您甚至不必查询collectionA。 DBRef只是透明的子对象,具有以下结构:{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }。所以你应该能够找到所需的文件:

db.collectionB.find("type.$id": 47);

这假设type下的所有dbref引用了相同的集合和数据库。如果不是这种情况,您需要在查询中包含这些内容,以避免结果引用另一个集合:

db.collectionB.find("type.$id": 47, "type.$ref": "collectionA", "type.$db": <database name>);