mongodb 复杂聚合嵌套条件 groupby

时间:2021-04-14 14:50:36

标签: mongodb aggregation

我有一组订单,如下所示:

[
  {
    _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
    } 
  }
]

关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:1)

  • $dateToString 将日期转换为您所需的特定格式
  • $unwind 解构 products 数组
  • $group by id, date 和 sum quantity
  • $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