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

要形成的查询:db.collectionB.find({type: DBRef("collectionA", NumberLong(47))});

集合 A 和集合 B 中有许多文档。我想搜索collectionB中“type”指的是collectionA中“_id”是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);

它使输出为空。为什么?

4

1 回答 1

4

DBRef的3 参数构造函数采用以下参数:

  • 数据库
  • 命名空间
  • ID

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

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

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

但是,当我了解您的要求时,“我想搜索 collectionB 中的“type”指的是 collectionA 中“_id”为 NumberLong(47) 的文档。正确地,您甚至不必查询 collectionA。DBRef 只是具有这种结构的透明子对象:{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }. 因此,您应该能够通过以下方式找到所需的文件:

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

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

db.collectionB.find("type.$id": 47, "type.$ref": "collectionA", "type.$db": <database name>);
于 2013-10-11T11:46:57.870 回答