簡體   English   中英

MongoDB聚合兩個不同的組

[英]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_IDSTATUS對此進行分組 ,並且在每個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進行分組
unwindunwind SPEC數組元素以獲取每個分隔的spec_id的數據
unwindunwind 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM