Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb中的多分组_Mongodb_Mongodb Query - Fatal编程技术网

mongodb中的多分组

mongodb中的多分组,mongodb,mongodb-query,Mongodb,Mongodb Query,样本采集数据: { "_id" : ObjectId("5f30df23243ffsdfwer3d14568bf"), "value" : { "busId" : 200.0, "status" : { "code" : { "id" : 1.0

样本采集数据:

  { 
    "_id" : ObjectId("5f30df23243ffsdfwer3d14568bf"), 
    "value" : {
        "busId" : 200.0, 
        "status" : {
            "code" : {
                "id" : 1.0, 
                "key" : "2100", 
                "value" : "Complete"
            }
        }
    }
}
我的查询确实提供了正确的结果,但希望通过使用多个分组或$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
      }
    }
  }
  
])
输出:

/* 1 */
{
    "_id" : {
        "busID" : 200.0,
        "status" : "Approved"
    },
    "subtotal" : 3.0
}    
/* 2 */
{
    "_id" : {
        "busID" : 200.0,
        "status" : "Rejected"
    },
    "subtotal" : 1.0
}
是否可以通过进一步分组来压缩输出? 输出应该如下所示

  {
    "_id" : {
        "busID" : 200.0,
        "Approved" : 3.0
        "Rejected" : 1.0   
    }
}
尝试使用$project,方法是将计数保留在文档中,但无法将计数与“批准”或“拒绝”相对应。
任何建议都很好。

您可以在查询后使用两个以上的管道

  • $group
    by
    busID
    并在
    状态中推送状态和计数
  • $project
    使用
    $arrayToObject
    状态
    数组转换为对象,并使用
    $mergeObjects
    busID
    合并

  {
    $group: {
      _id: "$_id.busID",
      status: {
        $push: {
          k: "$_id.status",
          v: "$subtotal"
        }
      }
    }
  },
  {
    $project: {
      _id: {
        $mergeObjects: [
          { busID: "$_id" },
          { $arrayToObject: "$status" }
        ]
      }
    }
  }