我能描述我想要实现的目标的最好方法是使用一个例子。基本上我会有一个汽车列表说:
[
{
_id: 1,
make: 'Toyota',
model: 'Prius'
},
{
_id: 2,
make: 'Toyota',
model: 'Prius'
},
{
_id: 3,
make: 'Toyota',
model: 'Yaris'
},
{
_id: 4,
make: 'Lexus',
model: 'RX400'
}
]
现在我想通过make
和model
(以及可能更多的字段)对它们进行分组/区分并计算总数。最终结果应该类似于:
{
makes: [
{
name: 'Toyota',
total: 3
}, {
name: 'Lexus',
total: 1
}
],
models: [
{
name: 'Prius',
total: 2
},
{
name: 'Yaris',
total: 1
},
{
name: 'RX400',
total: 1
}
]
}
我完全坚持这个。到目前为止,我能实现这一目标的唯一方法是为每个字段调用几个异步聚合调用。但是,我更愿意在单个聚合调用中执行此操作,如果可能的话(除非性能不是很好)。
答案 0 :(得分:2)
使用 $facet
:
db.collection.aggregate([
{ "$facet": {
"makes": [
{ "$group": {
"_id": "$make",
"total": { "$sum": 1 }
} },
{ "$project": {
"_id": 0,
"name": "$_id",
"total": 1
} }
],
"models": [
{ "$group": {
"_id": "$model",
"total": { "$sum": 1 }
} },
{ "$project": {
"_id": 0,
"name": "$_id",
"total": 1
} }
]
} }
])