使用java获取文档时在mongo查询中传递DBRef
要形成的查询:db.collectionB.find{type:DBRefcollectionA,NumberLong47} 集合a和集合B中有许多文档。我想搜索collectionB中的type指collectionA中id为NumberLong47的文档使用java获取文档时在mongo查询中传递DBRef,java,mongodb,mongodb-java,mongo-java,dbref,Java,Mongodb,Mongodb Java,Mongo Java,Dbref,要形成的查询:db.collectionB.find{type:DBRefcollectionA,NumberLong47} 集合a和集合B中有许多文档。我想搜索collectionB中的type指collectionA中id为NumberLong47的文档 db.collectionB.findOne() { "_id" : NumberLong(24), "class" : "Top", "type" : DBRef("collectionA", NumberLo
db.collectionB.findOne()
{
"_id" : NumberLong(24),
"class" : "Top",
"type" : DBRef("collectionA", NumberLong(47))
}
db.collectionA.findOne()
{
"_id" : NumberLong(47),
"name" : "John",
"position" : 2
}
它给出的输出为空。为什么?采用以下参数:
数据库
名称空间
身份证件
第二个参数不是名称空间,它只是集合。它应该是一个字符串yourDatabaseName.collectionB
你的第三个参数不仅仅是一个ID,它是一个完整的对象。这样,DBRef指向一个文档,其中字段_id的值是您传递的文档的完整副本。这样的文档不存在,因此获取DBRef将返回null
要创建有效的DBRef,只需将_id的值传递给DBRef的构造函数
但当我理解了您的要求后,我想搜索collectionB中的type是指collectionA中id为long47的文档。正确地说,您甚至不必查询collectionA。DBRef只是具有以下结构的透明子对象:{$ref:,$id:,$db:}。因此,您应该能够通过以下方式找到所需的文档:
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都引用相同的集合和数据库。如果情况并非如此,则需要在查询中包含以下内容,以避免结果引用其他集合:
db.collectionB.find("type.$id": 47);
采用以下参数:
数据库
名称空间
身份证件
第二个参数不是名称空间,它只是集合。它应该是一个字符串yourDatabaseName.collectionB
你的第三个参数不仅仅是一个ID,它是一个完整的对象。这样,DBRef指向一个文档,其中字段_id的值是您传递的文档的完整副本。这样的文档不存在,因此获取DBRef将返回null
要创建有效的DBRef,只需将_id的值传递给DBRef的构造函数
但当我理解了您的要求后,我想搜索collectionB中的type是指collectionA中id为long47的文档。正确地说,您甚至不必查询collectionA。DBRef只是具有以下结构的透明子对象:{$ref:,$id:,$db:}。因此,您应该能够通过以下方式找到所需的文档:
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都引用相同的集合和数据库。如果情况并非如此,则需要在查询中包含以下内容,以避免结果引用其他集合:
db.collectionB.find("type.$id": 47);
谢谢你的信息。这真的很有帮助。将参数传递给DBRef构造函数时,会出现另一个混乱,即使用哪个集合引用collectionB的集合或引用CollectionAbref myDbRef的集合=new DBRefdb,mydbname.collectionA,db_object.get_id;可以吗?@设置传递给DBRef构造函数的名称空间当然是DBRef应该指向的名称空间。谢谢您提供的信息。这真的很有帮助。将参数传递给DBRef构造函数时,会出现另一个混乱,即使用哪个集合引用collectionB的集合或引用CollectionAbref myDbRef的集合=new DBRefdb,mydbname.collectionA,db_object.get_id;可以吗?@SET传递给DBRef构造函数的名称空间当然是DBRef应该指向的名称空间。