gpt4 book ai didi

MongoDB 聚合,按子对象键分组

转载 作者:可可西里 更新时间:2023-11-01 09:12:59 29 4
gpt4 key购买 nike

我有一个 mongo 集合,其架构如下所示:

_id: ObjectId(),
segments: {
activity: 'value1',
activation: 'value2',
plan: 'value3'
}

例如,我正在尝试使用聚合框架找出我的文档中有多少具有分割事件的 value1。

问题是,如果可能的话,我想对同一请求中的每个段都这样做,而且我不知道我将拥有多少段,甚至不知道它们的名称。

基本上这是我想做的:

如果我有这两个文件:

{ _id: 1, segments: { activity: 'active', activation: 'inactive', plan: 'free' }
{ _id: 2, segments: { activity: 'inactive', activation: 'inactive', plan: 'free' }

我希望能够看到其中两个具有非事件的激活段和免费计划,并且该事件具有 1 个非事件值和 1 个事件值。这是我想要得到的:

{ 
activity: {
active: 1,
inactive: 1
},
activation: {
inactive: 2
},
plan: {
free: 2
}
}

所以基本上,如果您可以通过按键$group 就太好了!像这样:

{
$group: {
_id: { $concat: [ '$segments.$key', '-', '$segments.$key.$value' ],
count: { $sum: 1 }
}
}

或者如果我可以在每个键上放松...

最佳答案

要获得计数,请利用 $cond $group 中的运算符管道步骤根据子文档值评估计数,如下所示:

db.collection.aggregate([    
{
"$group": {
"_id": "$_id",
"activity_active": {
"$sum": {
"$cond": [ { "$eq": [ "$segment.activity", "active" ] }, 1, 0 ]
}
},
"activity_inactive": {
"$sum": {
"$cond": [ { "$eq": [ "$segment.activity", "inactive" ] }, 1, 0 ]
}
},
"activation_active": {
"$sum": {
"$cond": [ { "$eq": [ "$segment.activation", "active" ] }, 1, 0 ]
}
},
"activation_inactive": {
"$sum": {
"$cond": [ { "$eq": [ "$segment.activity", "inactive" ] }, 1, 0 ]
}
},
"plan_free": {
"$sum": {
"$cond": [ { "$eq": [ "$segment.plan", "free" ] }, 1, 0 ]
}
}
}
},
{
"$project": {
"_id": 0,
"activity": {
"active": "$activity_active",
"inactive": "$activity_inactive"
},
"activation": {
"active": "$activation_active",
"inactive": "$activation_inactive"
},
"plan": {
"free": "$plan_free"
}
}
}
])

关于MongoDB 聚合,按子对象键分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37252832/

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