mongodb - 减去 MongoDB 中的组聚合值

标签 mongodb mongodb-query aggregation-framework

我有一个集合,用于存储用户投票值 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/

相关文章:

mongodb - 嵌入式文档上 findAndModify 的原子性

mongodb - 如何检索 MongoDB 上每个其他不同字段的字段最大的文档?

java - 将数据附加到现有的 gridfs 文件

node.js - 具有连接的近几何

javascript - mongodb的mapreduce函数

MongoDB 聚合查找匹配数组

mongodb - Mongo : Find documents that have 0 associated documents, 更便宜

node.js - 将不同分组总计合并到总输出中

java - java中使用mongo存储库嵌套字段查询

java - MongoDB 中的查询场景