mongodb中的多个分组

sur*_*das 2 mongodb mongodb-query

样本收集数据:

  { 
    "_id" : ObjectId("5f30df23243ffsdfwer3d14568bf"), 
    "value" : {
        "busId" : 200.0, 
        "status" : {
            "code" : {
                "id" : 1.0, 
                "key" : "2100", 
                "value" : "Complete"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的查询确实提供了正确的结果,但希望通过使用多个分组或 $project 或任何其他聚合器来更多地压缩输出。

mongo 查询:

db.suraj_coll.aggregate([
  {
    $addFields: {
      "value.available": {
        $cond: [
          {
            $in: [
              "$value.status.code.value",
              [
                "Accept",
                "Complete"
              ]
            ]
          },
          "Approved",
          "Rejected"
        ]
      }
    }
  },
  {
    "$group": {
      "_id": {
        busID: "$value.busId",
        status: "$value.available"
      },
      "subtotal": {
        $sum: 1
      }
    }
  }
  
])
Run Code Online (Sandbox Code Playgroud)

输出:

/* 1 */
{
    "_id" : {
        "busID" : 200.0,
        "status" : "Approved"
    },
    "subtotal" : 3.0
}    
/* 2 */
{
    "_id" : {
        "busID" : 200.0,
        "status" : "Rejected"
    },
    "subtotal" : 1.0
}
Run Code Online (Sandbox Code Playgroud)

是否可以通过使用任何进一步的分组来更多地压缩输出?输出应如下所示

  {
    "_id" : {
        "busID" : 200.0,
        "Approved" : 3.0
        "Rejected" : 1.0   
    }
}
Run Code Online (Sandbox Code Playgroud)

尝试使用 $project,将计数保留在 doc 中,但无法将计数置于 Approve 或 Rejected 中。任何建议都会很棒。

tur*_*hal 5

您可以在查询后使用更多两个管道,

  • $group通过busID并推送状态并计数status
  • $projectstatus数组转换为对象 using$arrayToObject并与busIDusing合并$mergeObjects
  {
    $group: {
      _id: "$_id.busID",
      status: {
        $push: {
          k: "$_id.status",
          v: "$subtotal"
        }
      }
    }
  },
  {
    $project: {
      _id: {
        $mergeObjects: [
          { busID: "$_id" },
          { $arrayToObject: "$status" }
        ]
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

操场