如何在mongodb聚合中进行多例匹配分组?
How to match and group in multiple cases in mongodb aggregation?
我有 4 名球员在不同的比赛中得分。
例如
{user: score} -- json keys
{'a': 10}, {'a':12}, {'b':16}
我正在尝试找到一种使用聚合函数找到单个玩家总和的方法。
users.aggregation([{$match:{'user':'a'}},{$group:{_id: null, scores:{$sum:'$score'}])
我也在为 b 重复同样的事情并继续
在镜头中,我为不同的用户做了太多次相同的事情。
最好的方式或不同的方式或优化方式是什么,这样我就可以为所有用户编写一次聚合查询
根据用户对数据进行分组。即
users.aggregation([{$group:{_id: "$user", scores:{$sum:'$score'}}}])
您可以将所需的 users
与 $in
子句匹配,然后按照@Sourbh Gupta 的建议进行分组。
db.users.aggregate([
{$match:{'user':{$in: ['a', 'b', 'c']}}},
{$group:{_id: '$user', scores:{$sum:'$score'}}}
])
不太确定你的文档结构,但如果你有 2 个不同的字段对应 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
,他有 2x a
分和 1x b
分。
我们现在可以编写聚合查询来匹配 bob,然后对分数求和。
db.scores.aggregate([
{ $match: { user : "bob" } },
{ $group: { _id : "$user", sumA : { $sum : "$score.a" }, sumB : { $sum : "$score.b" } } },
{ $project: { user: 1, score : { $sum: [ "$sumA", "$sumB" ] } } }
]);
这会给我们以下结果
{ "_id" : "bob", "score" : 38 }
我有 4 名球员在不同的比赛中得分。 例如
{user: score} -- json keys
{'a': 10}, {'a':12}, {'b':16}
我正在尝试找到一种使用聚合函数找到单个玩家总和的方法。
users.aggregation([{$match:{'user':'a'}},{$group:{_id: null, scores:{$sum:'$score'}])
我也在为 b 重复同样的事情并继续
在镜头中,我为不同的用户做了太多次相同的事情。
最好的方式或不同的方式或优化方式是什么,这样我就可以为所有用户编写一次聚合查询
根据用户对数据进行分组。即
users.aggregation([{$group:{_id: "$user", scores:{$sum:'$score'}}}])
您可以将所需的 users
与 $in
子句匹配,然后按照@Sourbh Gupta 的建议进行分组。
db.users.aggregate([
{$match:{'user':{$in: ['a', 'b', 'c']}}},
{$group:{_id: '$user', scores:{$sum:'$score'}}}
])
不太确定你的文档结构,但如果你有 2 个不同的字段对应 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
,他有 2x a
分和 1x b
分。
我们现在可以编写聚合查询来匹配 bob,然后对分数求和。
db.scores.aggregate([
{ $match: { user : "bob" } },
{ $group: { _id : "$user", sumA : { $sum : "$score.a" }, sumB : { $sum : "$score.b" } } },
{ $project: { user: 1, score : { $sum: [ "$sumA", "$sumB" ] } } }
]);
这会给我们以下结果
{ "_id" : "bob", "score" : 38 }