【问题标题】:Add structured properties during Mongodb $group aggregation stage在 Mongodb $group 聚合阶段添加结构化属性
【发布时间】:2021-10-04 03:52:02
【问题描述】:

我有以下结构的数据:

{
    name: "xyz",
    numericProperty: 28
}

我想做一个聚合组阶段,给我一个形状的结构:

{
    _id: "xyz",
    name: "xyz",
    numericProperty: {
        min: minvalue,
        max: maxvalue,
        avg: avgvalue
    }
}

我试过了:

{
    "$group":{
        "_id":"$name",
        "name":{"$first":"$name"},
        "numericProperty": {
            "min": {"$min":"$numericProperty"},
            "max": {"$min":"$numericProperty"},
            "avg": {"$min":"$numericProperty"}
        }
    }
}

这给了我错误The field 'numericProperty' must be an accumulator object

这促使我尝试(我现在看到$addFields 不是累加器对象,而是它自己的管道阶段):

{
    "$group":{
        "_id":"$name",
        "name":{"$first":"$name"},
        "numericProperty": {"$addFields":[
            "min": {"$min":"$numericProperty"},
            "max": {"$min":"$numericProperty"},
            "avg": {"$min":"$numericProperty"}]

        }
    }
}

这给了我错误:The $addFields accumulator is a unary operator

我已经试过了:

{
    "$group":{
        "_id":"$name",
        "name":{"$first":"$name"},
        "numericProperty.min": {"$min":"$numericProperty"}
        "numericProperty.max": {"$min":"$numericProperty"}
        "numericProperty.avg": {"$min":"$numericProperty"}
    }
}

这给了我错误The field name 'numericProperty.min' cannot contain '.'

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    $addFields 不是累加器运算符。您可以查看accumulator operator list

    相反,更简单的方法是添加$project 阶段以将numericProperty 显示为对象文档。

    db.collection.aggregate([
      {
        "$group": {
          "_id": "$name",
          "name": {
            "$first": "$name"
          },
          "min": {
            "$min": "$numericProperty"
          },
          "max": {
            "$max": "$numericProperty"
          },
          "avg": {
            "$avg": "$numericProperty"
          }
        }
      },
      {
        $project: {
          _id: 1,
          name: 1,
          numericProperty: {
            min: "$min",
            max: "$max",
            avg: "$avg"
          }
        }
      }
    ])
    

    Sample Mongo Playground


    没有$project 阶段,您需要双$group 阶段和$mergeObjects

    $mergeObjects 在合并文档时会覆盖字段值。 如果要合并的文档包含相同的字段名称,则该字段在 结果文档,具有合并的最后一个文档的值 领域。

    在第一个/唯一一个$group 阶段使用$mergeObjects,这些$min$max$avg 将无法正常工作。$mergeObjects 运算符将采用上面提到的文档的最后一个值。

    因此,它需要第二个$group 阶段为$mergeObjects,因为在第一个$group 阶段之后返回的文档具有唯一的_id(非重复的name )。

    db.collection.aggregate([
      {
        "$group": {
          "_id": "$name",
          "name": {
            "$first": "$name"
          },
          "min": {
            "$min": "$numericProperty"
          },
          "max": {
            "$max": "$numericProperty"
          },
          "avg": {
            "$avg": "$numericProperty"
          }
        }
      },
      {
        $group: {
          _id: "$name",
          "name": {
            "$first": "$name"
          },
          "numericProperty": {
            "$mergeObjects": {
              "min": "$min",
              "max": "$max",
              "avg": "$avg"
            }
          }
        }
      }
    ])
    

    Sample Mongo Playground (dual $group stages)

    【讨论】:

    • 太棒了!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2018-12-19
    • 2018-07-21
    相关资源
    最近更新 更多