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 中有许多文档。我想搜索集合 B 中的"type"是指集合 A 中"_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);
它给出输出空。为什么?
DBRef 的 3 参数构造函数采用以下参数:
- 数据库
- Namespace
- 身份证
第二个参数不是命名空间,它只是集合。它应该是一个字符串"yourDatabaseName.collectionB"
。
你的第三个参数不仅仅是一个 ID,它是一个完整的对象。这样,DBRef 就会指向一个文档,其中字段_id
的值是您传递的文档的完整副本。这样的文档不存在,因此获取 DBRef 返回 null。
要创建有效的 DBRef,您只需将 _id
的值传递给 DBRef
的构造函数。
但是当我理解您的要求"我想搜索集合 B 中的"类型"是指集合 A 中"_id"为 NumberLong(47) 的文档"的文档时,您甚至不必查询集合 A。DBRef 只是具有以下结构的透明子对象:{ "$ref" : <value>, "$id" : <value>, "$db" : <value> }
。因此,您应该能够通过以下方式找到所需的文档:
db.collectionB.find("type.$id": 47);
这假定所有 dbref 在type
引用相同的集合和数据库。如果不是这种情况,则需要在查询中包含以下内容,以避免结果引用另一个集合:
db.collectionB.find("type.$id": 47, "type.$ref": "collectionA", "type.$db": <database name>);