Mongodb聚合,在groupBy上获得预期结果,无需硬编码类别

Mongodb聚合,在groupBy上获得预期结果,无需硬编码类别,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我的目标是编写一个高效的查询,即使用给定的输入,为我提供预期的输出。我有一些可行的解决方案,但所有的“类型”都是“手动”编写的,所以我想我正在寻求帮助,以获得相同的输出,但方式不同 输入 报告ID 类型 重量 A. “鱼” 4. A. “鱼” 2. A. “奶牛” 0 B “鱼” 2. B “金枪鱼” 1. B “鸟” 我将集中讨论第二部分,这是一个困难的部分。我不知道是否有一个更短更好的解决方案,但这一个应该有效: db.collection.aggregate([ { $unse

我的目标是编写一个高效的查询,即使用给定的输入,为我提供预期的输出。我有一些可行的解决方案,但所有的“类型”都是“手动”编写的,所以我想我正在寻求帮助,以获得相同的输出,但方式不同

输入

报告ID 类型 重量 A. “鱼” 4. A. “鱼” 2. A. “奶牛” 0 B “鱼” 2. B “金枪鱼” 1. B “鸟”
我将集中讨论第二部分,这是一个困难的部分。我不知道是否有一个更短更好的解决方案,但这一个应该有效:

db.collection.aggregate([
  {
    $unset: "_id"
  },
  {
    $set: {
      data: {
        "$objectToArray": "$$ROOT"
      }
    }
  },
  {
    $group: {
      _id: "$reportId",
      data: {
        $push: "$data"
      }
    }
  },
  {
    $set: {
      data: {
        $reduce: {
          input: "$data",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    $set: {
      data: {
        $filter: {
          input: "$data",
          cond: {
            $not: {
              $in: [
                "$$this.k",
                [
                  "totalCount",
                  "totalWeight"
                ]
              ]
            }
          }
        }
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $group: {
      _id: "$_id",
      data: {
        $push: "$data"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$data"
      }
    }
  }
])

请看

我将集中讨论第二部分,这是一个困难的部分。我不知道是否有一个更短更好的解决方案,但这一个应该有效:

db.collection.aggregate([
  {
    $unset: "_id"
  },
  {
    $set: {
      data: {
        "$objectToArray": "$$ROOT"
      }
    }
  },
  {
    $group: {
      _id: "$reportId",
      data: {
        $push: "$data"
      }
    }
  },
  {
    $set: {
      data: {
        $reduce: {
          input: "$data",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              "$$this"
            ]
          }
        }
      }
    }
  },
  {
    $set: {
      data: {
        $filter: {
          input: "$data",
          cond: {
            $not: {
              $in: [
                "$$this.k",
                [
                  "totalCount",
                  "totalWeight"
                ]
              ]
            }
          }
        }
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $group: {
      _id: "$_id",
      data: {
        $push: "$data"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$data"
      }
    }
  }
])

请参见

Amazin job,它几乎就在那里-我需要按reportId分组的数据。但我不知道这是否更简单/更好。目前正在查看更新后的oneAmazin作业的数据,它几乎就在那里-我需要按reportId分组的数据。但我不知道这是否更简单/更好。目前正在调查$1,请获取更新的