mongodb 复杂聚合嵌套条件groupby

mongodb complex aggregation nested conditional groupby

我有一个订单集合,看起来像这样:

[
  {
    _id: ObjectID,
    date: Date,
    products: [
      {
        id: string,
        quantity: number
      },
      {
        id: string,
        quantity: number
      },
    ]
  }
]

我需要汇总它们,以便我可以使用 product.id 确定每个日期(不是时间)的每个 ID 的数量

我的结果数据集看起来类似于:

[
  { 
    date: "2021-01-1", 
    products: {
      // product_id: quantity
      PRODUCT_ID_1: 4
      PRODUCT_ID_2: 9
    } 
  }
]

关于如何执行此操作的任何想法?

  • $dateToString 将日期转换为您需要的特定格式
  • $unwind解构products数组
  • $group 乘以 iddatequantity
  • $group 仅按日期并以键值格式构造产品数组
  • $arrayToObjectproducts 数组转换为对象
db.collection.aggregate([
  {
    $addFields: {
      date: {
        $dateToString: {
          date: "$date",
          format: "%Y-%m-%d"
        }
      }
    }
  },
  { $unwind: "$products" },
  {
    $group: {
      _id: {
        date: "$date",
        id: "$products.id"
      },
      quantity: { $sum: "$products.quantity" }
    }
  },
  {
    $group: {
      _id: "$_id.date",
      products: {
        $push: {
          k: "$_id.id",
          v: "$quantity"
        }
      }
    }
  },
  {
    $project: {
      products: { $arrayToObject: "$products" }
    }
  }
])

Playground