我有一个数据如下的集合
{
"_id": ObjectId("5c630163b5284c5e6fb163d2"),
"createdDate": ISODate("2019-02-12T17:24:51.844Z"),
"year": 2004,
"vehicleMake": ObjectId("5bcc8fdefdc6ed2b6733b478"),
"vehicleModel": ObjectId("5bcc8fe0fdc6ed2b6733b88d")
}
我正在尝试像这样进行方面汇总:
Vehicle.model.aggregate([
{ $match: { year: 2015 } },
{ $facet: {
vehicleMake: [{ $group: { _id: '$vehicleMake', count: { $sum: 1 }}}, { $sort: { count: -1, _id: -1 }}],
vehicleModel: [{ $group: { _id: '$vehicleModel', count: { $sum: 1 }}}, { $sort: { count: -1, _id: -1 }}],
year: [{ $group: { _id: '$year', count: { $sum: 1 }}}, { $sort: { _id: -1, _id: -1 }}],
yearRange: [ { $bucketAuto: { groupBy: '$year', buckets: 5 } }],
}
}
])
我的结果看起来像这样:
[
{
"vehicleMake": [
{
"_id": "5bcc8fdefdc6ed2b6733b4d5",
"count": 1
},
{
"_id": "5bcc8fdefdc6ed2b6733b4cf",
"count": 1
},
{
"_id": "5bcc8fdefdc6ed2b6733b4c7",
"count": 1
}
],
"vehicleModel": [
{
"_id": "5bcc8fe1fdc6ed2b6733bb7a",
"count": 1
},
{
"_id": "5bcc8fe0fdc6ed2b6733b6ab",
"count": 1
},
{
"_id": "5bcc8fe0fdc6ed2b6733b65d",
"count": 1
}
],
"year": [
{
"_id": 2015,
"count": 3
}
],
"yearRange": [
{
"_id": {
"min": 2015,
"max": 2015
},
"count": 3
}
]
}
]
请告诉我如何使用populate()从引用的集合(vehicleMake和vehicleModel)中获取数据,以获取名称属性而不是ObjectId并获得类似以下结果:
"vehicleMake": [
{
"_id": "Audi",
"count": 1
},
{
"_id": "BMW",
"count": 1
}
]
或者也许有比populate()更好的选择?
答案 0 :(得分:0)
您在架构中引用模型的名称,然后调用填充
答案 1 :(得分:0)
好的,我找到了解决方案。代替populate()的是&lookup操作,最后我的工作聚合看起来像这样:
Vehicle.model.aggregate([
{ $match: { year: 2015 } },
{ $facet: {
vehicleMake: [
{ $lookup: { from: 'vehiclemakes', localField: 'vehicleMake', foreignField: '_id', as: 'makes' }},
{ $group: { _id: '$makes.name', count: { $sum: 1 }}}, { $sort: { _id: 1, count: -1 }}
],
vehicleModel: [{ $group: { _id: '$vehicleModel', count: { $sum: 1 }}}, { $sort: { count: -1, _id: -1 }}],
year: [{ $group: { _id: '$year', count: { $sum: 1 }}}, { $sort: { _id: -1, _id: -1 }}],
yearRange: [ { $bucketAuto: { groupBy: '$year', buckets: 5 } }],
}
}
])