我使用的mongoDB具有以下格式的集合。
{name : x city : AAA , status : active , radius : 1 }
{name : x city : AAA , status : active , radius : 4 }
{name : x city : AAA , status : inactive , radius : 7 }
{name : x city : BBB , status : inactive , radius : 7 }
{name : Y city : AAA , status : active , radius : 8 }
{name : Y city : BBB , status : inactive , radius : 5 }
{name : Y city : BBB , status : inactive , radius : 12 }
{name : Z city : CCC , status : deleted , radius : 15 }
现在,我想要名称和 class 的唯一组合,并且对于该组合,还需要状态字段的活动计数,非活动计数和已删除计数的子组。因此总体输出报告将采用以下格式
Name City total Active Inactive deleted
X AAA 3 2 1 0
X BBB 1 0 1 0
Y AAA 1 1 0 0
Y BBB 2 0 2 0
Z CCC 1 0 0 1
由于我是mongodb的新手,因此可以有人建议使用聚集或任何其他方法以最少的查询获取所需输出格式的任何方法吗?
答案 0 :(得分:3)
您只需要一个$group
阶段,即可按名称和城市分组,并且每个active
,inactive
和deleted
字段都有一个条件总和。然后,在最后添加一个$project
阶段,以获取所需的确切格式。
db.collection.aggregate([
{
$group: {
"_id": {
name: "$name",
city: "$city"
},
total: {
$sum: 1
},
active: {
$sum: {
$cond: [ { $eq: [ "$status", "active" ] }, 1, 0 ]
}
},
inactive: {
$sum: {
$cond: [ { $eq: [ "$status", "inactive" ] }, 1, 0 ]
}
},
deleted: {
$sum: {
$cond: [ { $eq: [ "$status", "deleted" ] }, 1, 0 ]
}
}
}
},
{
$project: {
_id: 0,
name: "$_id.name",
city: "$_id.city",
total: "$total",
active: "$active",
inactive: "$inactive",
deleted: "$deleted"
}
}
])