如何按嵌入值分组并为其设置名称,总计数在 mongodb 中
How to group by embedded values and set a name to it with total count in mongodb
我的Collection:
样本CollectionJson结构:
{
"_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}}}
])
以上查询returns的输出
(示例输出):
{
"_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
}
所以基本上每当它找到 Accept/Complete 时,它都会增加值/对计数求和并根据名称 Approved 进行存储。对于取消,将值更改为 Rejected。
任何 advice/solution 都会有所帮助。
太好了。你需要做的是,在分组前再添加一个字段来识别是否通过,这样会更容易。
{
$addFields: {
"value.available": {
$cond: [
{
$in: [
"$value.status.code.value",
[
"Accept",
"Complete"
]
]
},
"Approved",
"Rejected"
]
}
}
}
我的Collection:
样本CollectionJson结构:
{
"_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}}}
])
以上查询returns的输出 (示例输出):
{
"_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
}
所以基本上每当它找到 Accept/Complete 时,它都会增加值/对计数求和并根据名称 Approved 进行存储。对于取消,将值更改为 Rejected。
任何 advice/solution 都会有所帮助。
太好了。你需要做的是,在分组前再添加一个字段来识别是否通过,这样会更容易。
{
$addFields: {
"value.available": {
$cond: [
{
$in: [
"$value.status.code.value",
[
"Accept",
"Complete"
]
]
},
"Approved",
"Rejected"
]
}
}
}