我有一组订单,如下所示:
[
{
_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
}
}
]
关于如何做到这一点的任何想法?
答案 0 :(得分:1)
$dateToString
将日期转换为您所需的特定格式$unwind
解构 products
数组$group
by id
, date
和 sum quantity
$group
仅按日期并以键值格式构造产品数组$arrayToObject
将 products
数组转换为对象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" }
}
}
])