用$ facet进行聚合时,猫鼬如何使用populate()?

时间:2019-03-09 12:45:45

标签: mongodb mongoose aggregate facet populate

我有一个数据如下的集合

{
  "_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()更好的选择?

2 个答案:

答案 0 :(得分:0)

您在架构中引用模型的名称,然后调用填充

Check this answer

答案 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 } }],
                }
              }
            ])