2016-11-27 16 views
0

マイドキュメントは(この質問のための時点を無視する)、次のようになります。集計配列

{ 
    "_id": "xyz-800", 
    "site": "xyz", 
    "user": 800, 
    "timepoints": [ 
     {"timepoint": 0, "a": 1500, "b": 700}, 
     {"timepoint": 2, "a": 1000, "b": 200}, 
     {"timepoint": 4, "a": 3500, "b": 1500} 
    ], 
    "groupings": [ 
     {"type": "MNO", "group": "<10%", "raw": "1"}, 
     {"type": "IJK", "group": "Moderate", "raw": "23"} 
    ] 
} 

は、私は平らにすることはできます(そうでないかもしれない右項)のでgroupingsは、単一のドキュメントです。私はmnoGroupmnoRaw属性groupings.type = "MNO"が存在するかどう関係なく作成する属性をしたいと思います実際には

{ 
    "id": "xyz-800", 
    "site": "xyz", 
    "user": 800, 
    "mnoGroup": "<10%", 
    "mnoRaw": "1", 
    "ijkGroup": "Moderate", 
    "ijkRaw": "23" 
} 

:私は、その結果は次のようになりたいと思います。 ijk属性と同じです。

答えて

1

あなたは最終的なプロジェクトの段階で、オプションの値を投影する最初のプロジェクトの段階でインデックスによってグループ化列を読み、$ifNullする$arrayElemAtを使用することができます。リッテ冗長だが、私は何ができるかを見るだろう。

db.groupmore.aggregate({ 
    "$project": { 
     _id: 1, 
     site: 1, 
     user: 1, 
     mnoGroup: { 
      $arrayElemAt: ["$groupings", 0] 
     }, 
     ijkGroup: { 
      $arrayElemAt: ["$groupings", -1] 
     } 
    } 
}, { 
    "$project": { 
     _id: 1, 
     site: 1, 
     user: 1, 
     mnoGroup: { 
      $ifNull: ["$mnoGroup.group", "Unspecified"] 
     }, 
     mnoRaw: { 
      $ifNull: ["$mnoGroup.raw", "Unspecified"] 
     }, 
     ijkGroup: { 
      $ifNull: ["$ijkGroup.group", "Unspecified"] 
     }, 
     ijkRaw: { 
      $ifNull: ["$ijkGroup.raw", "Unspecified"] 
     } 
    } 
}) 

サンプル出力

{ "_id" : "xyz-800", "site" : "xyz", "user" : 800, "mnoGroup" : "<10%", "mnoRaw" : "1", "ijkGroup" : "Moderate", "ijkRaw" : "23" } 
{ "_id" : "ert-600", "site" : "ert", "user" : 8600, "mnoGroup" : "Unspecified", "mnoRaw" : "Unspecified", "ijkGroup" : "Unspecified", "ijkRaw" : "Unspecified" } 
+0

提案をいただき、ありがとうございます。フィルタを追加して最初の要素を取り、ハードコーディングしていないようにしました。 "mnoGroup:{$ arrayElemAt:[{$ filter:{入力:" $ cohorts "、" cohort "、cond:{$ eq:[" $$ cohort.cohortType "、" MNO "]}}}、0 ]}、 ' –

+0

ええ、私はその昨晩、今朝忘れるしかないと思った。申し訳ありません。 – Veeram

+0

心配はいりません。あなたは正しい方向に私を指摘し、私は私の脳を運動させなければならない。私はMongoDBで3年生を卒業したばかりだと思います。新しい冒険に。 –