2017-03-02 134 views
0

我有數據集,我需要兩個不同的組,由該數據集的值。請看下面設置數據,MongoDB聚合兩個不同的組

[{ 
    "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_ID狀態同時,各ASSIGN_ID組裏面,我需要SPEC_ID並且還通過狀態。請看以下預期的輸出,

[{ 
    "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 
     }] 
     } 
    ] 
    } 
] 
目前

,我做了什麼,到目前爲止僅僅是組ASSIGN_ID狀態請看下面的代碼,

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" 
     } 
     } 
    } 
    } 
]); 

,其結果是

[ 
    { 
    "_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

你是什麼蒙戈服務器版本? – Veeram

+0

版本:3.2.1 –

回答

0

這是一個多通道流水線;如果需要在同一通道內獲取兩組不同的分組;將不得不先組一組。一旦到達該集合,保留下一組分組所需的數據。

管道涉及:
group:(1)組通過ASSIGN_ID,SPEC_ID,STATUS - 獲取計數對於該組合​​
group:(2)組通過ASSIGN_ID,SPEC_ID - 準備SPEC_GROUP陣列
group:(3 )分組依據ASSIGN_ID - 準備對象SPEC_ARRAY陣列
project:選擇ASSIGN_ID,SPEC_ARRAY,SPEC_ARRAY數據的副本用於通過STATUS製備分組
unwind:開卷SPEC數組元素以獲得數據爲每個spec_id分離
unwind:展開SPEC陣列。 SPEC_GROUP元素爲每個spec_id /狀態獲取數據
group:(4)按ASSIGN_ID分組,STATUS - 獲取每個狀態的計數[當獲得與每個狀態相對應的計數ADD計數,因爲我們已按SPEC_ID分組],請選擇SPEC_ARRAY從第一行作爲被重複所有跨
group:(5)集團通過ASSIGN_ID - 獲得分配組陣列,選擇SPEC_ARRAY從第一行作爲被重複所有跨

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

您可以嘗試替代聚合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" 
     } 
    } 
}]) 

$reduce 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

使用這aggregate命令,測試你的樣本數據,

 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()