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

使用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.find{type:DBRefcollectionA,NumberLong47}

集合a和集合B中有许多文档。我想搜索collectionB中的type指collectionA中id为NumberLong47的文档

 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应该指向的名称空间。