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。为什么呢?
答案 0 :(得分:3)
3-argument constructor of DBRef采用以下参数:
你的第二个参数不是命名空间,它只是集合。它应该是一个字符串"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>);