Агрегирование MongoDB, отображение лучших результатов из двух отдельных коллекций - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь выполнить функцию aggregate в своей коллекции, но не могу подобрать правильный запрос для данной работы.

Моя цель - показать топ 2 самых быстрых кругов на всех картах и показать имя и фамилию соответствующего пользователя.

Здесьмои коллекции статистики:

{
    "_id" : ObjectId("5c86674d87e8cd468c850c86"),
    "lapTime" : "1:32:29",
    "map" : "France",
    "driver" : [ 
        ObjectId("5c7c499b555fa13f50c9c248")
    ],
    "date" : ISODate("2019-03-11T13:49:01.472Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("5c8667ec87e8cd468c850c87"),
    "lapTime" : "2:32:34",
    "map" : "France",
    "driver" : [ 
        ObjectId("5c7c499b555fa13f50c9c248")
    ],
    "date" : ISODate("2019-03-11T13:51:40.895Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("5c86674x87e8Sd567c120c86"),
    "lapTime" : "1:12:29",
    "map" : "France",
    "driver" : [ 
        ObjectId("5c7c499b555fa13f50c9c248")
    ],
    "date" : ISODate("2019-03-11T10:49:01.472Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("5c8667f887e8cd468c850c88"),
    "lapTime" : "1:88:29",
    "map" : "Italy",
    "driver" : [ 
        ObjectId("5c7c499b555fa13f50c9c248")
    ],
    "date" : ISODate("2019-03-11T13:51:52.727Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("5c866970c65910291c6f2000"),
    "lapTime" : "1:34:29",
    "map" : "Italy",
    "driver" : [ 
        ObjectId("5c80f78ca0ecdf26c83dfc8a")
    ],
    "date" : ISODate("2019-03-11T13:58:08.135Z"),
    "__v" : 0
}
{
    "_id" : ObjectId("5c868532b5c50c17b0917f9e"),
    "lapTime" : "1:43:33",
    "map" : "Italy",
    "driver" : [ 
        ObjectId("5c80f78ca0ecdf26c83dfc8a")
    ],
    "date" : ISODate("2019-03-11T15:56:34.869Z"),
    "__v" : 0
}

Поскольку я передаю идентификатор драйвера по ссылке здесь:
"driver":[ObjectId("5c7c499b555fa13f50c9c248")], я хочу отобразить атрибуты драйвера из моей коллекции users .

Вот один из моих пользовательских объектов:

{
    "_id" : ObjectId("5c7c499b555fa13f50c9c248"),
    "password" : "$2a$10$L..Pf44/R7yJfNPdikIObe04aiJaY/e94VSKlFscjgYOe49Y7iwJK",
    "email" : "john.smith@yahoo.com",
    "firstName" : "John",
    "lastName" : "Smith",
    "laps" : [],
    "__v" : 0,
}

Вот что я попробовал до сих пор:

db.getCollection('stats').aggregate([
  { $group: {
    _id: { map: "$map" },   // replace `name` here twice
    laps: { $addToSet: "$lapTime" },
    driver:{$addToSet: "$driver"},
    count: { $sum: 1 } 
  } },
 {$lookup:
       {
         from: "users",
         localField: "firstName",
         foreignField: "lastName",
         as: "driver"
       }}, 
  { $match: { 
    count: { $gte: 2 } 
  } },
  { $sort : { count : -1} },
  { $limit : 10 }
]);

В результате я получаю driversкак пустой массив.

То, что я на самом деле пытаюсь достичь, это что-то вроде этого:

{
    "_id" : {
        "map" : "France"
    },
    "laps" : [ 
        "Jonathan Smith":"2:32:34", 
        "Someone Else":"1:32:29"
    ],
    "count" : 2.0
}

1 Ответ

1 голос
/ 12 марта 2019

Я думаю, что это должно работать: -

   db.getCollection('stats').aggregate([
         { $unwind: "$driver" },
         {$lookup:
               {
                 from: "users",
                 localField: "driver",
                 foreignField: "_id",
                 as: "driver"
               }},
          { $group: {
            _id: { map: "$map" },   // replace `name` here twice
            laps: { $addToSet: 
                    { 
                      lapTime: "$lapTime", 
                      driverName: "$driver.firstName" + "$driver.lastName" 
                    }
                  },
            count: { $sum: 1 } 
          } }, 
          { $match: { 
            count: { $gte: 2 } 
          } },
          { $sort : { count : -1} },
          { $limit : 10 }
        ]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...