首页 > 解决方案 > MongoDB - 如何按两个字段和字段的总和值分组?

问题描述

我有这样的数组 json 以及如何对itemId不同的日期进行分组:

let data=[
           {itemId:'001', tranDate:'2020/03/15', qty:10},
           {itemId:'001', tranDate:'2020/03/15', qty:30},
           {itemId:'002', tranDate:'2020/03/15', qty:20},
           {itemId:'001', tranDate:'2020/03/16', qty:50},
         ]

我想要如下图所示的结果:

需要输出

请帮助我。

标签: javascriptmongodbmeteormongodb-queryaggregation-framework

解决方案


您可以使用 MongoDB 的聚合来执行此操作:

db.collection.aggregate([
  /** group on itemId & tranDate & sum qty field values */
  {
    $group: { _id: { itemId: "$itemId", k: "$tranDate" }, v: { $sum: "$qty" } }
  },
  /** Push entire data into data field [{k :k...,v:v...},{k :k...,v:v...}] */
  {
    $project: {
      _id: 0,
      data: {
        $arrayToObject: [
          [
            { k: "$_id.k", v: "$v" },
            { k: "itemId", v: "$_id.itemId" }
          ]
        ]
      }
    }
  },
  /** Replace data as new root for each document */
  { $replaceRoot: { newRoot: "$data" } }
]);

测试: MongoDB-游乐场

参考 : $group , $project , $arrayToObject , $replaceRoot


推荐阅读