2014-10-21 2 views
0

유형이 지정된 모음을 통해 집계하려고합니다. 유형이 foo는 경우 유형이 사용자에 의해 나는 그룹에 원하는 경우 나는 필드 저자에 의해 그룹으로합니다.MongoDb는 값에 따라 두 필드로 그룹화하고 그룹화합니다.

이 모든 것이 하나의 쿼리에서 발생해야합니다.

예 데이터 : 유형 경우

{ 
    "_id": 1, 
    "author": { 
    "someField": "abc", 
    }, 
    "type": "foo" 
} 

{ 
    "_id": 2, 
    "author": { 
    "someField": "abc", 
    }, 
    "type": "foo" 
} 

{ 
    "_id": 3, 
    "user": { 
    "someField": "abc", 
    }, 
    "type": "bar" 
} 

이 사용자 필드는 존재한다.

그래서 기본적으로 ... $or으로 표현하려고했습니다.

function() { 
var results = db.vote.aggregate([ 
    { $or: [ { 

     { $match : { type : "foo" } }, 
     { $group : { _id : "$author", sumAuthor : {$sum : 1} } } }, 

     { { $match : { type : "bar" } }, 
     { $group : { _id : "$user", sumUser : {$sum : 1} } } 
    } ] } 
]); 
return results; 
} 

누구에게 좋은 해결책이 있습니까?

답변

1

나는 그것이

db.c.aggregate([{ 
    $group : { 
     _id : { 
      $cond : [{ 
       $eq : [ "$type", "foo"] 
      }, "author", "user"] 
     }, 
     sum : { 
      $sum : 1 
     } 
    } 
}]); 
0

아래의 솔루션은 조금 ... "바"를

정리 될 수있다

db.vote.aggregate(
     { 
      $project:{ 
       user:{ $ifNull: ["$user", "notbar"]}, 
       type:1 
      } 
     }, 
     { 
      $group:{ 
       _id:{_id:"$user.someField"}, 
       sumUser:{$sum:1} 
      } 
     } 
    ) 

이 또한주의 (참고 "foo는"을 위해, 당신은 약간 변경해야합니다)에서 _id를해야합니다 유형 "바"이 아닌 당신 최종 답변, 아무것도 = null이

0
수행 할 수 있다고 생각

여기서 원하는 것은 $cond 연산자입니다.이 연산자는 조건이 참이거나 거짓 인 특정 값을 반환하는 삼항 연산자입니다.

db.vote.aggregate([ 
    { "$group": { 
     "_id": null, 
     "sumUser": { 
      "$sum": { 
       "$cond": [ { "$eq": [ "$type", "user" ] }, 1, 0 ] 
      } 
     }, 
     "sumAuhtor": { 
      "$sum": { 
       "$cond": [ { "$eq": [ "$type", "auhtor" ] }, 1, 0 ] 
      } 
     } 
    }} 
]) 

이 기본적으로 현재 문서의 "유형"을 테스트하고 $sum 운영에 1 또는 0 중 하나를 통과 여부를 결정합니다.

"user"및 "author"필드에 예제와 동일한 값이 포함되어 있으면 그룹화가 잘못 수행되는 것을 방지 할 수 있습니다. 최종 결과는 두 가지 유형이 모두 포함 된 단일 문서입니다.

+0

내가 필요한 것은 아닙니다. 모든 저자 resp에 대한 문서가 필요합니다. 사용자는 그들의 합계가 – koengsen

+0

@koengsen 정도면 충분합니다. 나는 주로 제시된 데이터를 기반으로 단 하나의 문서로 귀결되었을 샘플을보고있었습니다. 저것과 당신은 총계를 요구하고있는 것처럼 보였습니다. –

관련 문제