gpt4 book ai didi

mongodb - 每个文档级别的聚合 mongodb

转载 作者:行者123 更新时间:2023-12-04 10:58:27 24 4
gpt4 key购买 nike

我有一个像这样的文件列表

[{
"_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 后,在 item 上应用 $group,然后提供以消除重复:
{ 
"$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 运算符给出无效错误。

任何其他方式来实现这一目标?

最佳答案

一般来说,这是对 $unwind 的反模式。一个数组然后到 $group上原_id因为大多数操作都可以在单个阶段直接在数组上完成。这是这样一个阶段的样子:

{$addFields:{
offers:{$arrayToObject:{
$map:{
input:{$setUnion:"$itemsPurchased.offer"},
as:"o",
in:[
"$$o",
{$size:{$setUnion:{$let:{
vars:{items:{$filter:{
input:"$itemsPurchased",
cond:{$eq:["$$this.offer","$$o"]}
}}},
in:{$reduce:{
input:"$$items",
initialValue:[],
in:{$concatArrays:["$$value","$$items.items"]}
}}
}}}
}]
}
}}
}}

这样做是创建一个数组,其中每个元素都是一个双元素数组(这是一种语法, $arrayToObject 可以转换为一个对象,其中第一个元素是键名,第二个是值),输入是一组唯一的优惠和对于每个我们累积一组产品,去掉重复项(使用 $setUnion ),然后得到结果的大小。这在您的输入中产生的是:
"offers" : {
"o1" : 2,
"o2" : 2,
"o3" : 1
}

关于mongodb - 每个文档级别的聚合 mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59017042/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com