2017-03-02 10 views
0

私はデータセットを持っており、そのデータセットから2つの異なるグループを必要とします。私はASSIGN_IDSTATUSを使用してグループにこれをしたいし、また各ASSIGN_IDグループ内の私はSPEC_IDともSTATUSによっては必要あり、データは以下の設定MongoDB 2つの異なるグループを集約します

[{ 
    "ASSIGN_ID": "583f84bce58725f76b322398", 
    "SPEC_ID": "58411772", 
    "STATUS": 1, 
    "UPDATE_DATE": ISODate("2016-12-21T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322398", 
    "SPEC_ID": "58411772", 
    "STATUS": 4, 
    "UPDATE_DATE": ISODate("2016-12-22T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322398", 
    "SPEC_ID": "58411772", 
    "STATUS": 4, 
    "UPDATE_DATE": ISODate("2016-12-23T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322398", 
    "SPEC_ID": "58411774", 
    "STATUS": 3, 
    "UPDATE_DATE": ISODate("2016-12-24T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322311", 
    "SPEC_ID": "58411775", 
    "STATUS": 1, 
    "UPDATE_DATE": ISODate("2016-12-25T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322311", 
    "SPEC_ID": "58411775", 
    "STATUS": 3, 
    "UPDATE_DATE": ISODate("2016-12-23T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322322", 
    "SPEC_ID": "58411774", 
    "STATUS": 1, 
    "UPDATE_DATE": ISODate("2016-12-20T04:10:23.000Z") 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322322", 
    "SPEC_ID": "58411778", 
    "STATUS": 4, 
    "UPDATE_DATE": ISODate("2016-12-21T04:10:23.000Z") 
    } 
] 

を見つけてください。私は今のところちょうどグループASSIGN_IDSTATUSすることにより、以下のコードを見つけてください

Modal.aggregate([ 
    { 
    "$group": { 
     "_id": { 
     "INSPECTED_BY": "$INSPECTED_BY", 
     "STATUS": "$STATUS" 
     }, 
     "spec_id": "$SPEC_ID", 
     "total": { 
     "$sum": 1 
     } 
    } 
    }, { 
    "$group": { 
     "_id": "$_id.INSPECTED_BY", 
     "data": { 
     "$push": { 
      "STATUS": "$_id.STATUS", 
      "total": "$total" 
     } 
     } 
    } 
    } 
]); 

と結果がされなかったものを、現在

[{ 
    "ASSIGN_ID": "583f84bce58725f76b322398", 
    "ASSIGN_GROUP": [{ 
     "STATUS": 1, 
     "COUNT": 1 
     }, 
     { 
     "STATUS": 3, 
     "COUNT": 1 
     }, 
     { 
     "STATUS": 4, 
     "COUNT": 2 
     } 
    ], 
    "SPEC_ARRAY": [{ 
     "SPEC_ID": "58411772", 
     "SPEC_GROUP": [{ 
      "STATUS": 1, 
      "COUNT": 1 
      }, 
      { 
      "STATUS": 4, 
      "COUNT": 2 
      } 
     ] 
     }, 
     { 
     "SPEC_ID": "58411774", 
     "SPEC_GROUP": [{ 
      "STATUS": 3, 
      "COUNT": 1 
     }] 
     } 
    ] 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322311", 
    "ASSIGN_GROUP": [{ 
     "STATUS": 1, 
     "COUNT": 1 
     }, 
     { 
     "STATUS": 3, 
     "COUNT": 1 
     } 
    ], 
    "SPEC_ARRAY": [{ 
     "SPEC_ID": "58411775", 
     "SPEC_GROUP": [{ 
      "STATUS": 1, 
      "COUNT": 1 
     }, 
     { 
      "STATUS": 3, 
      "COUNT": 1 
     } 
     ] 
    }] 
    }, 
    { 
    "ASSIGN_ID": "583f84bce58725f76b322322", 
    "ASSIGN_GROUP": [{ 
     "STATUS": 1, 
     "COUNT": 1 
     }, 
     { 
     "STATUS": 4, 
     "COUNT": 1 
     } 
    ], 
    "SPEC_ARRAY": [{ 
     "SPEC_ID": "58411774", 
     "SPEC_GROUP": [{ 
      "STATUS": 1, 
      "COUNT": 1 
     }] 
     }, 
     { 
     "SPEC_ID": "58411778", 
     "SPEC_GROUP": [{ 
      "STATUS": 4, 
      "COUNT": 1 
     }] 
     } 
    ] 
    } 
] 

、以下の期待される出力を見つけてください

[ 
    { 
    "_id": "583f84bce58725f76b322398", 
    "data": [ 
     { 
     "STATUS": 1, 
     "COUNT": 1 
     }, { 
     "STATUS": 3, 
     "COUNT": 1 
     }, { 
     "STATUS": 4, 
     "COUNT": 2 
     } 
    ] 
    }, { 
    "_id": "583f84bce58725f76b322311", 
    "data": [ 
     { 
     "STATUS": 1, 
     "COUNT": 1 
     }, { 
     "STATUS": 3, 
     "COUNT": 1 
     } 
    ] 
    }, { 
    "_id": "583f84bce58725f76b322322", 
    "data": [ 
     { 
     "STATUS": 1, 
     "COUNT": 1 
     }, { 
     "STATUS": 4, 
     "COUNT": 1 
     } 
    ] 
    } 
] 

私には、適切な解決策を提供して、期待される結果を得てください。

+0

あなたのmongoサーバのバージョンは何のために$reduceで最後の四つの段階を置き換えますか? – Veeram

+0

バージョン:3.2.1 –

答えて

0

マルチパスパイプラインです。同じパス内で2つの異なるグループのグループを取得する必要がある場合。最初に1組をグループ化する必要があります。そのセットが到着したら、次のグループ分けに必要なデータを保持します。

関与パイプライン:
group:(1)グループ別ASSIGN_ID、SPEC_ID、STATUS - この組み合わせ
groupのカウントを取得:(2)グループ別ASSIGN_ID、SPEC_ID - SPEC_GROUPアレイ
groupを準備します(3 )グループ化ASSIGN_ID - オブジェクト
projectのSPEC_ARRAYアレイを準備する:ASSIGN_ID、SPEC_ARRAY、STATUS
unwindによってグルーピング製造するSPEC_ARRAYデータのコピーを選択:各spec_idのデータを取得するためにアンワインドSPEC配列要素を
分離unwind:SPEC配列の巻き戻し。 (SPEC_IDによってグループ分けされているので、各ステータスに対応するカウントADDカウントを取得する場合)、SPEC_ARRAYを選択してください。最初の行から繰り返しているすべてにわたって
group:(5)グループ別ASSIGN_ID - すべてにわたって

db.Modal.aggregate([ { 
    $group : { 
     _id : { 
      ASSIGN_ID : "$ASSIGN_ID", 
      SPEC_ID : "$SPEC_ID", 
      STATUS : "$STATUS" 
     }, 
     a_s_cnt : { 
      $sum : 1 
     } 
    } 
}, { 
    $group : { 
     _id : { 
      ASSIGN_ID : "$_id.ASSIGN_ID", 
      SPEC_ID : "$_id.SPEC_ID" 
     }, 
     SPEC_GROUP : { 
      $push : { 
       STATUS : "$_id.STATUS", 
       COUNT : "$a_s_cnt" 
      } 
     } 
    } 
}, { 
    $group : { 
     _id : "$_id.ASSIGN_ID", 
     SPEC_ARRAY : { 
      $push : { 
       SPEC_ID : "$_id.SPEC_ID", 
       SPEC_GROUP : "$SPEC_GROUP" 
      } 
     } 
    } 
}, { 
    $project : { 
     _id : 0, 
     ASSIGN_ID : "$_id", 
     SPEC_ARRAY : "$SPEC_ARRAY", 
     forStatus : "$SPEC_ARRAY" 
    } 
}, { 
    $unwind : "$forStatus" 
}, { 
    $unwind : "$forStatus.SPEC_GROUP" 
}, { 
    $group : { 
     _id : { 
      ASSIGN_ID : "$ASSIGN_ID", 
      STATUS : "$forStatus.SPEC_GROUP.STATUS" 
     }, 
     statusCount : { 
      $sum : "$forStatus.SPEC_GROUP.COUNT" 
     }, 
     SPEC_ARRAY : { 
      $first : "$SPEC_ARRAY" 
     } 
    } 
}, { 
    $group : { 
     _id : "$_id.ASSIGN_ID", 
     ASSIGN_GROUP : { 
      $push : { 
       STATUS : "$_id.STATUS", 
       COUNT : "$statusCount" 
      } 
     }, 
     SPEC_ARRAY : { 
      $first : "$SPEC_ARRAY" 
     } 
    } 
}, { 
    $project : { 
     _id : 0, 
     ASSIGN_ID : "$_id", 
     ASSIGN_GROUP : "$ASSIGN_GROUP", 
     SPEC_ARRAY : "$SPEC_ARRAY" 
    } 
} ]) 
1

あなたが代替を試すことができますを繰り返していると、最初の行から割り当てグループ配列、選択SPEC_ARRAYを取得バージョン3.2の下での集計

Modal.aggregate([{ 
    $group: { 
     _id: { 
      ASSIGN_ID: "$ASSIGN_ID", 
      SPEC_ID: "$SPEC_ID", 
      STATUS: "$STATUS" 
     }, 
     COUNT: { 
      $sum: 1 
     } 
    } 
}, { 
    $group: { 
     _id: { 
      ASSIGN_ID: "$_id.ASSIGN_ID", 
      SPEC_ID: "$_id.SPEC_ID" 
     }, 
     SPEC_GROUP: { 
      $push: { 
       STATUS: "$_id.STATUS", 
       COUNT: "$COUNT" 
      } 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.ASSIGN_ID", 
     SPEC_ARRAY: { 
      $push: { 
       SPEC_ID: "$_id.SPEC_ID", 
       SPEC_GROUP: "$SPEC_GROUP" 
      } 
     } 
    } 
}, { 
    $project: { 
     ASSIGN_ID: "$_id", 
     ASSIGN_GROUP: "$SPEC_ARRAY.SPEC_GROUP", 
     SPEC_ARRAY: 1 
    } 
}, { 
    $unwind: "$ASSIGN_GROUP" 
}, { 
    $unwind: "$ASSIGN_GROUP" 
}, { 
    $group: { 
     _id: "$ASSIGN_ID", 
     ASSIGN_GROUP: { 
      $push: "$ASSIGN_GROUP" 
     }, 
     SPEC_ARRAY: { 
      $first: "$SPEC_ARRAY" 
     } 
    } 
}]) 

バージョンあなたのサンプルデータでテスト3.4

{ 
    $project: { 
     _id: 0, 
     ASSIGN_ID: "$_id", 
     SPEC_ARRAY: 1, 
     ASSIGN_GROUP: { 
      $reduce: { 
       input: "$SPEC_ARRAY.SPEC_GROUP", 
       initialValue: [], 
       in: { 
        $concatArrays: ["$$value", "$$this"] 
       } 
      } 
     } 
    } 
} 
0

使用この集計コマンド、

 db.test.aggregate([{ 
    $group: { 
     _id: { 
      ASSIGN_ID: "$ASSIGN_ID", 
      STATUS: "$STATUS", 
      SPEC_ID: "$SPEC_ID" 
     }, 
     count: { 
      "$sum": 1 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.ASSIGN_ID", 
     ASSIGN_GROUP: { 
      $push: { 
       STATUS: "$_id.STATUS", 
       count: "$count" 
      } 
     }, 
     SPEC_ARRAY: { 
      $push: { 
       SPEC_ID: "$_id.SPEC_ID", 
       STATUS: "$_id.STATUS", 
       count: "$count" 
      } 
     } 
    } 
}, { 
    $unwind: "$SPEC_ARRAY" 
}, { 
    $group: { 
     _id: { 
      ASSIGN_ID: "$_id", 
      SPEC_ID: "$SPEC_ARRAY.SPEC_ID" 
     }, 
     ASSIGN_GROUP: { 
      $first: "$ASSIGN_GROUP" 
     }, 
     SPEC_GROUP: { 
      $push: { 
       "STATUS": "$SPEC_ARRAY.STATUS", 
       count: "$SPEC_ARRAY.count" 
      } 
     } 
    } 
}, { 
    $group: { 
     _id: "$_id.ASSIGN_ID", 
     ASSIGN_GROUP: { 
      $first: "$ASSIGN_GROUP" 
     }, 
     SPEC_ARRAY: { 
      $push: { 
       SPEC_ID: "$_id.SPEC_ID", 
       SPEC_GROUP: "$SPEC_GROUP" 
      } 
     } 
    } 
} 

]).pretty() 
関連する問題