2016-12-20 7 views
0

다른 경기에서 점수가있는 4 명의 선수가 있습니다. 예컨대mongodb 집계에서 여러 경우에 일치시키고 그룹화하는 방법은 무엇입니까?

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

나는 집계 함수를 사용하여 하나의 플레이어의 합을 발견 할 수있는 방법을 찾기 위해 노력하고있다.

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

는 나 또한 나에 대해 같은 일을 반복하고 내가 너무 많은 시간에 다른 사용자를 위해 같은 일을하고 있어요 샷에서

을 계속하고있다.

가장 좋은 방법이나 다른 방법 또는 방법을 최적화 무엇, 그래서 내가

답변

1

@Sourbh 굽타는 제안 당신은 단지 다음 그룹을 $in 절에 필요한 users을 일치 할 수 있습니다.

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

그룹 사용자에 기초하여 데이터를 모든 사용자에 대해 한 번 집계 쿼리를 작성할 수 있습니다. 즉

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

을 줄 것이다 그래서 그것은 바로 방법이다. 내가 1ha 사용자라면 1 lakh 문서가 표시됩니다. 일치 검색어를 사용하여이를 제한 할 수 있습니까? –

0

도 문서 구조에 대해 확실하지만, 당신은 당신이 다음 그룹화 및 합계 다음 프로젝트와 합계 한 후 2 개 그룹화 합계 수 2 개 diffrent 점수에 대한 2 개 diffrent 필드를 가지고있는 경우에하지 (즉, 의미가있는 경우)

그래서 예를 들어, 나는이 docuemnts 있습니다

> 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을 그는 배 a 점수와 1 배 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 }