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 中。任何建议都会很棒。
您可以在查询后使用更多两个管道,
$group
通过busID
并推送状态并计数status
$project
将status
数组转换为对象 using$arrayToObject
并与busID
using合并$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)
归档时间: |
|
查看次数: |
68 次 |
最近记录: |