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,方法是将计数保留在文档中,但无法将计数与“批准”或“拒绝”相对应。
任何建议都很好。您可以在查询后使用两个以上的管道
by$group
并在busID
状态中推送状态和计数
使用$project
将$arrayToObject
数组转换为对象,并使用状态
与$mergeObjects
合并busID
{
$group: {
_id: "$_id.busID",
status: {
$push: {
k: "$_id.status",
v: "$subtotal"
}
}
}
},
{
$project: {
_id: {
$mergeObjects: [
{ busID: "$_id" },
{ $arrayToObject: "$status" }
]
}
}
}