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


 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>);

相关内容

  • 没有找到相关文章

最新更新