[英]MongoDB Aggregate two different groups
我有數據集,我需要該數據集的兩個不同的按值分組。 請在下面找到數據集,
[{
"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和STATUS對此進行分組 ,並且在每個ASSIGN_ID組內部也需要SPEC_ID並通過STATUS進行分組。 請在下面找到預期的輸出,
[{
"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分組 ,按STATUS,請找到下面的代碼,
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
}
]
}
]
請為我提供合適的解決方案,以達到預期的效果。
您可以嘗試以下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版的$reduce
替換為最后四個階段
{
$project: {
_id: 0,
ASSIGN_ID: "$_id",
SPEC_ARRAY: 1,
ASSIGN_GROUP: {
$reduce: {
input: "$SPEC_ARRAY.SPEC_GROUP",
initialValue: [],
in: {
$concatArrays: ["$$value", "$$this"]
}
}
}
}
}
這是一個多通道管道; 如果需要在同一遍中獲取兩組不同的分組; 首先必須分組。 到達該組后,保留下一組分組所需的數據。
涉及的管道:
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
: unwind
SPEC數組元素以獲取每個分隔的spec_id的數據
unwind
: unwind
SPEC陣列。 SPEC_GROUP元素獲取每個單獨的spec_id / status的數據
group
:(4)按ASSIGN_ID,STATUS分組-獲取每個狀態的計數[由於我們已經按SPEC_ID分組,因此當獲取與每個狀態相對應的計數ADD計數時,請從第一行中選擇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"
}
} ])
使用此匯總命令,並通過示例數據進行測試,
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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.