Как объединить две коллекции в Mongoose / MongoDB? - PullRequest
1 голос
/ 01 октября 2019

На моем учебном сервере. У меня есть две коллекции с пользователями и их расами . Races обладает свойством userId, чтобы узнать, какой пользователь сделал эту гонку. Мне нужно сделать объединенный объект для всех пользователей и всех рас.

У меня есть коллекция пользователей:

[
    {
        "_id": "5d938ec8b17e522018e327db",
        "name": "max",
        "surname": "buinevich",
        "username": "axe",
        "__v": 0
    }
]

и коллекция рас:

[
    {
        "_id": "5d93ac4c7076dc212ce187d6",
        "userId": "5d938ec8b17e522018e327db",
        "stageId": "5d939e16d4e51d2eac81827d",
        "title": "test race",
        "time": 33,
        "description": "test desc",
        "__v": 0
    }
]

Поэтому мне нужно объединить всех пользователей с соответствующими расами, чтобы получить такой результат, как:

[
    {
        "_id": "5d938ec8b17e522018e327db",
        "name": "max",
        "surname": "buinevich",
        "username": "axe",
        "races": [{
                    "_id": "5d93ac4c7076dc212ce187d6",
                    "userId": "5d938ec8b17e522018e327db",
                    "stageId": "5d939e16d4e51d2eac81827d",
                    "title": "test race",
                    "time": 33,
                    "description": "test desc",
                    "__v": 0
                }]
        "__v": 0
    }
]

Я не хочу использовать ссылки вКоллекционные схемы. Может быть, что-то вроде агрегата мангуста или еще что-то.

1 Ответ

0 голосов
/ 02 октября 2019

Если не использовать refs в mongoose schemas (хотя и рекомендуется), поскольку populate очень удобно для создания иерархических документов.

Опцияк использованию собственного конвейера агрегации $lookup, который по существу выполняет (аналог LEFT JOIN - SQL) в объединенной коллекции для заполнения документовв поле массива.

Запрос агрегации:

db.usersCollection.aggregate([
  {
    $lookup: {
      from: "racesCollection",
      localField: "_id",
      foreignField: "userId",
      as: "races"
    }
  }
]).pretty();

Запрос агрегации модели Mongoose будет выглядеть следующим образом:

UserModel.aggregate.lookup({
  from: "Races", //or Races.collection.name
  localField: "_id",
  foreignField: "userId",
  as: "races"
});

Выход:

{
    "_id" : ObjectId("5d938ec8b17e522018e327db"),
    "name" : "max",
    "surname" : "buinevich",
    "username" : "axe",
    "__v" : 0,
    "races" : [
        {
            "_id" : ObjectId("5d93ac4c7076dc212ce187d6"),
            "userId" : ObjectId("5d938ec8b17e522018e327db"),
            "stageId" : ObjectId("5d939e16d4e51d2eac81827d"),
            "title" : "test race",
            "time" : 33,
            "description" : "test desc",
            "__v" : 0
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...