【问题标题】:MongoDB aggregation framework approach to a multi-doc query多文档查询的 MongoDB 聚合框架方法
【发布时间】:2013-09-27 01:17:48
【问题描述】:

我正在寻找组织过滤的最佳方式。我有以下文件格式:

{
 _id: "info",
 ids: ["id1", "id2", "id3"]
}

{
 _id: "id1",
 value: 5
}

{
 _id: "id2",
 value: 1
}

{
 _id: "id3",
 value: 5
}

我需要进行以下查询:从 doc "info" 中按 id 获取所有文档,然后按值 5 将它们过滤掉。因此,结果将类似于:

{
 _id: "id1",
 value: 5
}

{
 _id: "id3",
 value: 5
}

我想我需要对 id 进行展开,但是我如何选择与这些值匹配的所有文档?或者也许我应该以某种方式使用 $in 运算符来获取所有文档,然后进行过滤?

如有任何帮助,我们将不胜感激。谢谢。

【问题讨论】:

    标签: mongodb mapreduce aggregation-framework


    【解决方案1】:

    如果只是 MongoDB shell/脚本,我会这样做:

    db.ids.find({ _id: { $in: db.ids.findOne({ _id: "info" }).ids }, value: 5 })
    

    您还有更差的版本,使用:

    • 或eval command:

      db.runCommand({
          eval: function(value) {
              var ids = db.ids.findOne({ _id: "info" }).ids;
              return db.ids.find({ _id: { $in: ids }, value: value }).toArray();
          },
          args: [5]
      })
      
    • 或$where operator(性能低,因为您使用value 5 为每个候选结果执行一个查找):

      db.ids.find({
          value: 5,
          $where: "db.ids.findOne({ _id: 'info', ids: this._id })"
      })
      

    但如果您尝试通过 MongoDb 驱动程序运行查询,情况可能会有所不同。

    【讨论】:

    • 嗨,不,这将是从一种语言调用的,而不是从 shell 调用的。我将进行其他操作,例如一起进行值的总和等。在您的情况下,这似乎是不可能的,因为这只是带有 $in 运算符的 2 个嵌套查询。就我而言,这可能是巨大的,从数百万的总列表中搜索多达十万个文档:) 我想在这种情况下它要么是聚合框架,要么是 map\reduce。
    • 是的,map reduce 很强大。我没有为您的示例找到 map-reduce 解决方案。
    猜你喜欢
    • 2023-01-31
    • 2020-08-02
    • 2014-03-04
    • 2014-05-11
    • 2015-11-19
    • 1970-01-01
    • 2020-07-15
    • 2023-03-30
    • 1970-01-01
    相关资源
    最近更新 更多