MongoDB聚合没有重复

时间:2017-12-21 10:27:04

标签: mongodb aggregation-framework

我有以下记录:

{ "_id" : 1, "c" : 120, "b" : [ { "f1" : 10 }, { "f1" : 10 } ] }
{ "_id" :2, "c" : 5, "b" : [ { "f1" : 10 }, { "f1" : 10 } ] }

我需要这样输出:

{ "_id" : 1, 'total':140}
{ "_id" :2, 'total':25 }

其中total =' c'与f1中相同记录的值之和。

当我放松场地时,' b'它创建两个具有相同id的文档,因此数据被复制,当我总结时,我得到:

db.test2.aggregate([ 
  {'$unwind':'$b'},
  {'$project':{'total':{'$add':['$c','$b.f1']}}},
  {'$group':{'_id':'$_id', 'total':{'$sum':'$total'}}}
])

输出:

{ "_id" : 1, 'total':260}
{ "_id" :2, 'total':30 }

(不是我想要的,因为在展开过程中由于重复而增加了120和5)

所以我试过了:

db.test2.aggregate([ 
   {'$unwind':'$b'},
   {'$group':{'_id':'$_id', 'c':{'$push': '$c'},'f1':{'$sum':'$b.f1'}}},
   {'$project':{'total':{'$add':[{'$arrayElemAt':['$c',0]},'$f1']}}}
])

输出:

{ "_id" : 1, 'total':140}
{ "_id" :2, 'total':25 }

(我想要的)

还有其他方法可以达到这个目的吗?

2 个答案:

答案 0 :(得分:2)

您可以尝试以下查询。求和运算符首先计算数组中的和,然后加上与其他字段计算总和。

db.test2.aggregate([{
  $project: {
       total: {"$add":["$c", {"$sum":"$b.f1"}]}
    }
}]

答案 1 :(得分:1)

替代方案:

db.test2.aggregate([{
        $project: {
            _id: 0,
            c: "$c",
            b: {
                $reduce: {
                    input: "$b.f1",
                    initialValue: 0,
                    in: {
                        $add: ["$$value", "$$this"]
                    }
                }
            }
        }
    },
    {
        $project: {
            _id: 0,
            total: {
                $sum: ["$c", "$b"]
            }
        }
    }
])

这会产生结果:

{ 
    "total" : 140
}
{ 
    "total" : 25
}

如果您需要字段_id,请将_id: 0中的$project替换为_id: 1

这会产生这样的结果:

{ 
    "_id" : 1, 
    "total" : 140
}
{ 
    "_id" : 2, 
    "total" : 25
}