2014-02-28 4 views
2

나는 아래에서 성취하고자하는 것이 MongoDB Aggregation Framework로 수행 될 수 있는지에 대해 누군가가 대답 할 수 있기를 희망한다.

1 백만 건에 가까운 문서로 다음과 유사한 사용자 데이터 구조가 있습니다.

{ 
    "firstName" : "John", 
    "lastName" : "Doe", 
    "state" : "NJ", 
    "email" : "[email protected]" 
    "source" : [ 
     { 
      "type" : "SOURCE-A", 
      "data" : { 
       "info" : "abc", 
       "info2" : "xyz" 
      } 
     }, 
     { 
      "type" : "SOURCE-B", 
      "data" : { 
       "info3" : "abc" 
      } 
     } 
    ] 
} 

다른 시스템에 데이터를 제공하려면 이전 데이터 세트의 제한된 정보로 플랫 파일 구조를 생성해야합니다.

firstname, lastname, email, is_source-a, is_source-b 

나는 "is_source-A"와 "is_source-B"를 채우기 위해 시도하는 조건 코드입니다 어려움에 봉착 부분을 : 열은 표현해야합니다. 다음 집계 쿼리를 사용하려고 시도했지만 $ COND와 함께 사용되는 $ EQ 연산자가 배열 내부의 데이터를 평가하는 것처럼 보이지 않으므로 (항상 false) 작동하는 방법을 알아낼 수 없습니다.

db.collection.aggregate([ 
    { 
     $project : { 
      _id : 0, 
      firstName : 1, 
      lastName: 1, 
      "is_source-a" : { 
       $cond : [ 
        { $eq: [ "$source.type", "source-a" ] }, 
        1, 
        0 
       ] 
      }, 
      "is_source-b" : { 
       $cond : [ 
        { $eq: [ "$source.type", "source-b" ] }, 
        1, 
        0 
       ] 
      } 
     } 
    } 
]); 

내가 먼저 배열을 UNWIND $ 수 있지만, 나는 각 사용자 문서의 여러 레코드와 바람과 다시 통합하는 방법을 이해하지 않습니다.

개체 배열을 처리 할 때 $ COND와 함께 $ EQ (또는 다른 연산자)를 사용하는 방법이 있습니까?

답변

5

당신은 바른 길에 확실히있어, 당신은 다시 함께 물건을 넣어 $group와 그것을 따르는 경우 $unwind을 사용하여 거기에 당신을 얻을 수 있습니다

db.collection.aggregate([ 
    {$unwind: '$source'}, 
    {$project: { 
     _id: 1, 
     firstName: 1, 
     lastName: 1, 
     email: 1, 
     'is_source-a': {$eq: ['$source.type', 'SOURCE-A']}, 
     'is_source-b': {$eq: ['$source.type', 'SOURCE-B']} 
    }}, 
    // group the docs that were duplicated in the $unwind back together by _id, 
    // taking the values for most fields from the $first occurrence of the _id, 
    // but the $max of the is_source fields so that if its true in any of the 
    // docs for that _id it will be true in the output for that _id. 
    {$group: { 
     _id: '$_id', 
     firstName: {$first: '$firstName'}, 
     lastName: {$first: '$lastName'}, 
     email: {$first: '$email'}, 
     'is_source-a': {$max: '$is_source-a'}, 
     'is_source-b': {$max: '$is_source-b'} 
    }}, 
    // project again to remove _id 
    {$project: { 
     _id: 0, 
     firstName: 1, 
     lastName: 1, 
     email: 1, 
     'is_source-a': '$is_source-a', 
     'is_source-b': '$is_source-b' 
    }} 
]) 
+0

이 정확히 내가 그것을 필요로하는 방식으로 작동하지만, $ GROUP 문에서 $ FIRST 및 $ MAX를 (를) 사용하는 것을 이해하려고합니다. NULL 값의 상황을 방지하기위한 해결 방법이 있습니까? –

+0

@ Joe-IV 좋아요. $ 그룹에서 진행중인 작업에 대한 자세한 내용은 업데이트 된 답변을 참조하십시오. – JohnnyHK

+0

완벽한! -이 답변과 함께, 나는이 [블로그 게시물] (http://www.davenewson.com/dev/conditional-aggregation-on-arrays-of-objects-in-mongodb)이 함께 조각을 넣는 데 유용하다는 것을 알았습니다 내 머리에. –

관련 문제