【问题标题】:Writing an aggregation query in MongodB在 MongodB 中编写聚合查询
【发布时间】:2020-08-26 01:04:18
【问题描述】:

这是我的示例文档结构,例如

{
    "my_object": {
        "1": {
            "seq": "1",
            "time": "xyz",
        },
        "2": {
            "seq": "2",
            "time": "abc",
            "sub_aray": {
                "0": {
                    "value": 10
                },
                "1": {
                    "value": 10
                },
                "2": {
                    "value": -10
                }
            }
        }
    }
}

所以我想要实现的是,如果存在 sub_array 的所有值的总和,如果找不到 sub_array,则默认为 0

{"seq" : "1", "sub_array" : 0},
{"seq" : "2", "sub_array" : 10}

我的 Mongo 版本是 3.4.6,我使用 PyMongo 作为我的驱动程序。

【问题讨论】:

  • 能否提供正确的json格式。
  • @turivishal 抱歉,现在应该修复了。
  • 为什么 seq2 是 20 而不是 10?
  • 感谢您的收看,这是 Gibbs 的拼写错误。
  • 我试图使用 map,然后只对“values”属性求和,但是当地图的“输入”的输入本身不存在时,问题就来了。

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

你可以这样做

playground

db.collection.aggregate([
  {
    $project: {
      "array": { //To remove dynamic keys - 1,2,etc
        "$objectToArray": "$my_object"
      }
    }
  },
  {//reshaping array
    "$unwind": "$array"
  },
  {
    $project: {//reshaping sub array to access via a static name
      "k": {
        "$objectToArray": "$array.v.sub_aray"
      },
      "seq": "$array.v.seq"
    }
  },
  {
    "$project": {//actual logic, output structure
      "sub_array": {
        $sum: "$k.v.value"
      },
      "_id": 0,
      "seq": 1
    }
  }
])

【讨论】:

  • 哇!这个超级干净❤️!非常感谢!
  • Gibbs,如果您也可以分享您对我的这个问题的想法stackoverflow.com/q/65857866/6524169,将不胜感激;非常感谢您的帮助和时间!
【解决方案2】:

技巧部分是使用$objectToArray 运算符来迭代my_object 项目。

db.collection.aggregate([
  {
    "$project": {
      "my_object": {
        "$map": {
          input: {
            "$objectToArray": "$my_object"
          },
          as: "obj",
          in: {
            seq: "$$obj.v.seq",
            sub_array: {
              $sum: {
                $map: {
                  input: {
                    "$objectToArray": "$$obj.v.sub_aray"
                  },
                  as: "sub",
                  in: "$$sub.v.value"
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "$unwind": "$my_object"
  },
  {
    "$replaceRoot": {
      "newRoot": "$my_object"
    }
  }
])

MongoPlayground

【讨论】:

  • 也感谢分享地图方法!❤️
猜你喜欢
  • 2019-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多