javascript - MongoDB 聚合两个不同的组

标签 javascript node.js mongodb mongoose aggregation-framework

我有数据集,我需要该数据集中的两个不同的分组依据值。请找到下面的数据集,

[{
    "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 对其进行分组,并在我需要 SPEC_ID 的每个 ASSIGN_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 进行分组,并按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"]
                }
            }
        }
    }
}

关于javascript - MongoDB 聚合两个不同的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42548447/

相关文章:

javascript - 在javascript中解释var a=b.c={}?

javascript - 删除两个重复的项目 javascript 数组

javascript - 处理 looooong HTTP 请求(当前使用 axios)

windows - 如何在 Windows Server 上升级 MongoDB

node.js - 获取数组中元素的索引

json - 对等方重置 MongoDB 连接

javascript - 创建一个通用方法来显示相应项目的附件名称

javascript - TypeError : user. 保存不是函数 [mongoose]

node.js - Express 4/Node JS - 优雅地管理 uncaughtException

node.js - 如何从 ExpressJS 返回一个数组?