【问题标题】:Query other attribute in MongoDB with DBRef使用 DBRef 查询 MongoDB 中的其他属性
【发布时间】:2014-01-17 04:14:16
【问题描述】:

我在 mongodb 中有两个表的结构:

> db.mapping.find()

{ "_id" : ObjectId("52d74f4941538c0b386090af"), 
  "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")), 
  "hit" : { "24" : 1, "25" : 1, "26" : 1, "27" : 2}}
...

> db.fttc.find()

{ "_id" : ObjectId("52d74f4841538c0b38609041"), 
  "full" : "build1111_tastcase_20", 
  "tags" : [  "tag_0" ] }
...

> db.mapping.find()[0].tc.fetch().full

build1111_tastcase_1

> db.mapping.find({'tc.$id':ObjectId("52d74f4841538c0b3860902e")})

{ "_id" : ObjectId("52d74f4941538c0b386090a0"), 
  "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
  "hit" : { "24" : 3, "25" : 3 } }
...

现在,我可以得到tc的属性'id'为ObjectId("52d74f4841538c0b3860902e")的物品了。

但是,我如何才能从 ma​​pping 中找到 所有 项,其 tc 的属性 'full' 是 'build1111_tastcase_20强>' ?

有查询语句吗?

任何帮助或建议将不胜感激!

【问题讨论】:

    标签: mongodb pymongo dbref


    【解决方案1】:

    实际上,您要求的是联接,这不是 MongoDB 中受支持的服务器端功能(按设计)。

    鉴于您的 mapping 集合目前只有一个 DBref 指向 fttc 集合,您必须通过在应用程序中使用多个查询并加入结果来解决这个问题。这将在服务器端进行三个查询:一个查找mapping 文档,一个查找相关的fttc 文档,最后在fttc 上搜索具有相同full 属性的匹配文档。

    在 MongoDB 中解决此问题的更好方法是将要查询的 full 属性非规范化,因此它最终保存在两个集合中。

    您的映射文档将如下所示:

    { "_id" : ObjectId("52d74f4941538c0b386090a0"), 
      "tc" : DBRef("fttc", ObjectId("52d74f4841538c0b3860902e")),
      "full" : "build1111_tastcase_20",
      "hit" : { "24" : 3, "25" : 3 }
    }
    

    您查找相关fttc 文档的查询变为简单的find()。由于您从两个集合中获取数据,您仍然需要进行两次查询,但这比当前方法少一个查询:

    doc = db.mapping.findOne({"_id" : ObjectId("52d74f4941538c0b386090a0")})
    related = db.fttc.find({"full" : doc.full});
    

    【讨论】:

      【解决方案2】:

      您通过db.dereference(db.mapping.find_one()['tc'])['full']访问“完整”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-01
        • 1970-01-01
        • 2017-05-21
        • 1970-01-01
        • 2017-10-31
        • 2013-08-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多