2017-12-11 5 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

$プロジェクトの組み合わせに基づいて、かなり長いソリューションが、期待通りになります:あなたが始めたが、その後、私はまだ存在しているのactivites知っておく必要があり、どのよう

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

関連する問題