如何在mongodb聚合中匹配和分组多个案例?

时间:2016-12-20 06:31:51

标签: mongodb mongoose nosql-aggregation

我有4名球员在不同比赛中得分。 例如

{user: score} -- json keys
{'a': 10}, {'a':12}, {'b':16}

我试图找出一种方法,我可以使用聚合函数找到单个玩家的总和。

users.aggregation([{$match:{'user':'a'}},{$group:{_id: null, scores:{$sum:'$score'}])

我也为b重复同样的事情并继续

在拍摄中,我为不同的用户做了太多次同样的事情。

什么是最佳方式或不同方式或优化方式,因此我可以为所有用户编写一次聚合查询

3 个答案:

答案 0 :(得分:1)

您可以将所需的users$in子句匹配,然后分组为@Sourbh Gupta建议。

db.users.aggregate([
{$match:{'user':{$in: ['a', 'b', 'c']}}},
{$group:{_id: '$user', scores:{$sum:'$score'}}}
])

答案 1 :(得分:0)

根据用户对数据进行分组。即。

 users.aggregation([{$group:{_id: "$user", scores:{$sum:'$score'}}}])

答案 2 :(得分:0)

对你的文档结构不太确定,但是如果你有两个不同的字段用于2个不同的分数,你可以将它们组合在一起然后然后进行投影,然后对2个分组的总和进行求和(如果有意义的话)

例如,我有这些文件:

> db.scores.find()
{ "_id" : ObjectId("5858ed67b11b12dce194eec8"), "user" : "bob", "score" : { "a" : 10 } }
{ "_id" : ObjectId("5858ed6ab11b12dce194eec9"), "user" : "bob", "score" : { "a" : 12 } }
{ "_id" : ObjectId("5858ed6eb11b12dce194eeca"), "user" : "bob", "score" : { "b" : 16 } }

请注意,我们有一位用户bob,他的得分为2倍a,得分为1倍{/ 1}。

我们现在可以编写一个聚合查询来匹配bob然后对得分求和。

b

这将给我们以下结果

db.scores.aggregate([
    { $match: { user : "bob" } },
    { $group: { _id : "$user", sumA : { $sum : "$score.a" }, sumB : { $sum : "$score.b" } } },
    { $project: { user: 1, score : { $sum: [ "$sumA", "$sumB" ] } } }
]);