Мангуст, как использовать populate () при агрегировании с $ facet? - PullRequest
0 голосов
/ 09 марта 2019

У меня есть коллекция с данными, как показано ниже

{
  "_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 голосов
/ 10 марта 2019

Хорошо, я нашел решение.Вместо 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 } }],
                }
              }
            ])
0 голосов
/ 09 марта 2019

вы ссылаетесь на название вашей модели в своей схеме, затем вызываете populate

Проверьте этот ответ

...