如何在mongodb中按嵌入值分组并为其设置名称以及总数

问题描述

我的收藏集:

Collection

样本收集Json结构:

{ 
    "_id" : ObjectId("5f30df2ca032ecb2d14568bf"),"value" : {
        "busId" : 100.0,"status" : {
            "code" : {
                "id" : 1.0,"key" : "2100","value" : "Complete"
            }
        }
    }
}

目标是获取单个busID的批准和拒绝状态计数。

db.suraj_coll.aggregate([
    {"$group" : {_id:{busId:"$value.busId",status:"$value.status.code.value"},count:{$sum:1}}}
])

上面的查询返回输出 (样本输出):

{ 
    "_id" : {
        "busId" : 200.0,"status" : "Cancel"
    },"count" : 2.0
}
{ 
    "_id" : {
        "busId" : 100.0,"status" : "Accept"
    },"count" : 1.0
}
{ 
    "_id" : {
        "busId" : 100.0,"status" : "Complete"
    },"count" : 2.0
}

但是我想提出一个条件,即每当找到值$ in(Complete,Accept)时,它将值更改为Approved并使计数为3。 我认为可以使用$ cond(聚合)完成此操作,但是发现也很难更改名称,更具体地说,我希望将输出显示为:

 { 
        "_id" : {
            "busId" : 200.0,"status" : "Rejected"
        },"count" : 2.0
    }
    { 
        "_id" : {
            "busId" : 100.0,"status" : "Approved"
        },"count" : 3
    }
    

因此,基本上,每当找到“接受/完成”时,它都会增加值/对计数求和,并以批准的名称存储。对于取消,将值更改为“已拒绝”。

任何建议/解决方案都会有所帮助。

解决方法

太好了。您需要做的是,只需在分组之前添加另一个字段以标识其是否已批准,这将使您更加轻松。

{
    $addFields: {
      "value.available": {
        $cond: [
          {
            $in: [
              "$value.status.code.value",[
                "Accept","Complete"
              ]
            ]
          },"Approved","Rejected"
        ]
      }
    }
  }

工作Mongo playground