我有一个集合,用于存储用户投票值 voteTypeID = 1
用于赞成票和 voteTypeID = 2
用于反对票和 loadoutID
与另一个系列相关。
我想按 loadoutID
进行分组,并获取所有赞成票并减去所有反对票,以得出差异。因此,如果加载有 20 赞成票和 2 反对票,我想返回 18 以及 loadoutID
.
我承认我对聚合函数相当陌生,之前只将它用于基本计数,但它对我来说还没有点击,非常感谢任何帮助。您对聚合的解释越多越好 =)
这是我最近一次失败的尝试
LoadoutVotes.aggregate([
{
$group: {
_id: '$loadoutID',
up: { $sum: { voteTypeID: 1}},
down: { $sum: { voteTypeID: 2 }}
}
},
{
$project: {
_id: '$loadoutID',
count: {$subtract: ['$up', '$down']}
}
}
])
JSON 数据
{
loadoutID: 'ObjectID-String',
voteTypeID: 1
}
最佳答案
$sum
聚合框架中的运算符采用一个参数,该参数是应用于分组的数值。通常,当您要计算出现次数时,您希望它是文档中字段的值或类似 1
的值。
您要做的是“有条件地”评估字段值,为此有 $cond
运算符(operator)。这将根据您的 voteTypeID
字段确定应用哪个值。所以你可以这样写:
LoaodoutVotes.aggregate([
{ "$group": {
"_id": "$loadoutID",
"up": {
"$sum": {
"$cond": [
{ "$eq": [ "$voteTypeID", 1 ] },
1,
0
]
}
},
"down": {
"$sum": {
"$cond": [
{ "$eq": [ "$voteTypeID", 2 ] },
1,
0
]
}
},
}},
{ "$project": {
"loadoutID": "$_id",
"count": { "$subtract": [ "$up", "$down" ] }
}}
])
或者像这样更有效,因为您可以在线“签署”值:
LoaodoutVotes.aggregate([
{ "$group": {
"_id": "$loadoutID",
"count": {
"$sum": {
"$cond": [
{ "$eq": [ "$voteTypeID", 1 ] },
1,
{ "$cond": [
{ "$eq": [ "$voteTypeID", 2 ] },
-1,
0
]}
]
}
}
}}
])
因此效率更高,因为 $group
现在只是管道中的一个 channel 。由于 $cond
是三元运算符 ( if-then-else ),因此条件也可以在线堆叠。所以要么是积极的,要么是消极的,要么什么都不是。
关于mongodb - 减去 MongoDB 中的组聚合值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27473315/