【发布时间】:2020-03-19 20:55:22
【问题描述】:
我有一个这样的文件列表
[{
"_id": "5dbc95f921d7625303fe2369",
"name": "John",
"itemsPurchased": [{
"offer": "o1",
"items": ["p1"]
},{
"offer": "o1",
"items": ["p1"]
},
{
"offer": "o1",
"items": ["p2"]
},
{
"offer": "o2",
"items": ["p1"]
}, {
"offer": "o7",
"items": ["p1"]
}
]
},
{
"_id": "zbc95f921d7625303fe2363",
"name": "Doe",
"itemsPurchased": [{
"offer": "o1",
"items": ["p11"]
},{
"offer": "o1",
"items": ["p11"]
},
{
"offer": "o2",
"items": ["p13"]
},
{
"offer": "o1",
"items": ["p22"]
},
{
"offer": "o2",
"items": ["p11"]
}, {
"offer": "o3",
"items": ["p11"]
}
]
}
]
我正在尝试计算每个客户对独特产品的独特报价,期望结果如下:
[
{
"_id": "5dbc95f921d7625303fe2369",
"name": "John",
"offersAndProducts": {
"o1":2,
"o2":2,
"o3":1
},
{
"_id": "zbc95f921d7625303fe2363",
"name": "Doe",
"offersAndProducts": {
"o1":2,
"o2":1,
"o7":1
}
]
我想对每个文档应用聚合,在对 itemsPurchased 执行 $unwind 后,在 items 上应用 $group,然后 on offer 以消除重复:
{
"$group" : {
"_id" : {
"item" : {
"$arrayElemAt" : [
"$itemsPurchased.item",
0.0
]
},
"count" : {
"$sum" : 1.0
},
"offer" : "$itemsPurchased.offer"
}
}
}
那么,
{
"$group" : {
"_id" : "$_id.offer",
"count" : {
"$sum" : 1.0
}
}
}
这给出了所有文档的产品和报价数组:
[
{o1:4,o2:3,o3:1,o7:1}
]
但我在文档级别需要它。
尝试了$addFeild,但$unwind 和$match 运算符给出了无效错误。
还有其他方法可以实现吗?
【问题讨论】:
-
我不了解输入和所需的输出。暂时只关注
John,您如何从输入中获得"o1":2,"o2":2,"o3":1的输出?o7怎么了? -
@BuzzMoschetti:抱歉打错了。预期输出为 [ { "_id": "zbc95f921d7625303fe2363", "name": "Doe", "offersAndProducts": { "o1": 2, "o2": 2, "o3": 1 } }, { "_id" :“5dbc95f921d7625303fe2369”,“名称”:“约翰”,“offersAndProducts”:{“o1”:2,“o2”:1,“o7”:1}}]
标签: mongodb mongoose mongodb-query aggregation-framework aggregate