2017-12-11 1 views
1

시나리오 : 회원은 4 가지 다른 활동 중에서 선택할 수 있습니다 (예/아니오). 다음의 입력에 기초

, 다음고정 배열 길이의 MongoDB 집합 조건부 푸시

[ 
{ 
    name:"member1", 
    activity:"activity1", 
    selected:true 
}, 
{ 
    name:"member1", 
    activity: "activity3", 
    selected:false 
}, 
{ 
    name:"member2", 
    activity:"activity2", 
    selected:true 
}, 
{ 
    name:"member2", 
    activity: "activity4", 
    selected:false 
} 

] 

사용자가 만든 않은 활동을 포함 4 (에 활성 (1)의 순서로 모든 4 개 활동의 부재의 선택을 보여주는 결과가 필요 아직 결정은)

[ 
    { 
     name:"member1", 
     activities:[true,null,false,null] 
    }, 
    { 
     name:"member2", 
     activities:[null,true,null,false] 
    } 
    ] 

나는 그것은 단지 포함, 다음 코드

db.collection("MemberActivities").aggregate(
    [ 
     { 
     $group: 
      { 
      _id: "$MemberName", 
      activities: { $push: "$selected"} 
      } 
     } 
    ] 

을 시도했지만 사용자가 결정한 활동 (예/아니오).

[ 
    { 
     _id:"member1", 
     activities:[true,false] 
    }, 
    { 
     _id:"member2", 
     activities:[true,false] 
    } ] 

원하는 결과를 얻는 방법을 안내하십시오.

답변

0

아주 긴 솔루션 $ 프로젝트 조합을 기반으로하지만, 예상대로 결과를 제공합니다 : 당신을 시작으로 기본적으로

db.answers.aggregate(
    [ 
     { 
     $group: { 
      _id: "$name", 
      activities: { 
       $push: { 
       k: "$activity", 
       v: "$selected" 
       } 
      } 
      } 
     }, 
     { 
      $project: { 
       "_id": 1, 
       "activities": { $arrayToObject: "$activities" } 
      } 
     }, 
     { 
      $project: { 
       _id: 1, 
       "activities.activity1": { $ifNull: [ "$activities.activity1", null ] }, 
       "activities.activity2": { $ifNull: [ "$activities.activity2", null ] }, 
       "activities.activity3": { $ifNull: [ "$activities.activity3", null ] }, 
       "activities.activity4": { $ifNull: [ "$activities.activity4", null ] }, 
     } 
     }, 
     { 
      $project: { 
       _id: 1, 
       activities: [ 
       "$activities.activity1", 
       "$activities.activity2", 
       "$activities.activity3", 
       "$activities.activity4" 
       ] 
      } 
     } 
    ]) 

우리가 이름으로 그룹 전체 컬렉션에 필요하지만 나는 여전히 존재하고 있고, 어느하는 행동이 알 필요가 아직 실종 상태입니다. 키 값 쌍 (k, v)은 이러한 배열을 객체로 변환하는 $arrayToObject의 진입 점입니다. 그런 다음 누락 값에 대해 coalescing을 null로 설정할 수 있습니다. 마지막 단계는 객체를 배열로 변환하여 원하는 순서를 유지합니다.

+0

와우! 매력처럼 작동합니다! 고마워요. – Muralikrishnan