Функция проекта MongoDB - PullRequest
       35

Функция проекта MongoDB

0 голосов
/ 25 февраля 2020

Я застрял при создании запроса MongoDB. У меня есть пять коллекций, которые имеют отношения друг с другом. См. Фото со структурой базы данных ниже.

MongoDB Версия: 4.2.3

После долгих раздумий я пришел к этому результату с помощью запроса ниже.

{ 
    "$lookup" : { 
      "from" : "capcodes", 
      "localField" : "capcodes", 
      "foreignField" : "_id", 
      "as" : "ccr"
  }
},
{ 
  "$lookup" : { 
      "from" : "regios", 
      "localField" : "ccr.regio", 
      "foreignField" : "_id", 
      "as" : "regionaam"
  }
}, 
{ 
  "$lookup" : { 
      "from" : "disciplines", 
      "localField" : "ccr.discipline", 
      "foreignField" : "_id", 
      "as" : "DisciplineNaam"
  }
}, 
{ 
  "$lookup" : { 
      "from" : "gpkrs", 
      "localField" : "ccr.gpkr", 
      "foreignField" : "_id", 
      "as" : "gkprNaam"
  }
}

Мой вывод:

[
  {
    "_id": "5e501008bb6f081a00aab18d",
    "capcodes": [
      "0900307",
      "0900350"
    ],
    "tijd": "2020-02-21T16:08:07.484Z",
    "melding": "BRANP 1 BGM-03 Reanimatie (Inzet AED) PARELGRASSTRAAT ARNHEM 073780",
    "device": "MACBOOK-VAN-SIMON",
    "__v": 0,
    "ccr": [
      {
        "_id": "0900307",
        "regio": "5dd5645d9c432c413ce3cfc1",
        "gpkr": "5dd5500f5f640af0afb9a23a",
        "functie": "ploegcommandant Arnhem",
        "__v": 0,
        "discipline": "5ddd10629ce8a5255458cf9b"
      },
      {
        "_id": "0900350",
        "regio": "5dd5645d9c432c413ce3cfc1",
        "gpkr": "5dd5500f5f640af0afb9a23f",
        "functie": "lichtkrant Vredenburg",
        "__v": 0,
        "discipline": "5ddd10629ce8a5255458cf9b"
      }
    ],
    "regionaam": [
      {
        "_id": "5dd5645d9c432c413ce3cfc1",
        "naam": "Gelderland Midden"
      }
    ],
    "DisciplineNaam": [
      {
        "_id": "5ddd10629ce8a5255458cf9b",
        "afkorting": "BRW",
        "naam": "Brandweer",
        "meldingBenaming": "BRAN",
        "__v": 0
      },
      {
        "_id": "5ddd10629ce8a5255458cc9b",
        "afkorting": "AMBU",
        "naam": "Ambulance",
        "meldingBenaming": "AMBU",
        "__v": 0
      }
    ],
    "gkprNaam": [
      {
        "_id": "5dd5500f5f640af0afb9a23a",
        "naam": "Arnhem"
      },
      {
        "_id": "5dd5500f5f640af0afb9a23f",
        "naam": "Arnhem Vredenburg"
      }
    ]
  }
]

Но это то, что я ищу ... This is what I want

У меня есть такой Идея, что я могу лучше всего решить эту проблему с помощью функции $ project Mon go, но я не знаю, как ... Заранее спасибо!

Структура базы данных Database Structure

Отредактировано 12:59 am

Хм, я нашел способ, который мог бы помочь. Функция $ concat от MongoDB .. Но я не могу заставить ее работать

1 Ответ

0 голосов
/ 25 февраля 2020

Попробуйте:

Meldingen.aggregate([
  {
    "$lookup": {
      "from": "capcodes",
      let: {
        capcodes: "$capcodes"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$_id",
                "$$capcodes"
              ]
            }
          }
        },
        {
          "$lookup": {
            "from": "regios",
            "localField": "regio",
            "foreignField": "_id",
            "as": "regionaam"
          }
        },
        {
          "$lookup": {
            "from": "disciplines",
            "localField": "discipline",
            "foreignField": "_id",
            "as": "disciplineNaam"
          }
        },
        {
          "$lookup": {
            "from": "gpkrs",
            "localField": "gpkr",
            "foreignField": "_id",
            "as": "gkprNaam"
          }
        },
        {
          $project: {
            _id: "$_id",
            regio: {
              $let: {
                vars: {
                  input: {
                    $arrayElemAt: [
                      "$regionaam",
                      0
                    ]
                  }
                },
                in: "$$input.naam"
              }
            },
            gpkr: {
              $let: {
                vars: {
                  input: {
                    $arrayElemAt: [
                      "$gkprNaam",
                      0
                    ]
                  }
                },
                in: "$$input.naam"
              }
            },
            discipline: {
              $let: {
                vars: {
                  input: {
                    $arrayElemAt: [
                      "$disciplineNaam",
                      0
                    ]
                  }
                },
                in: "$$input.naam"
              }
            }
          }
        }
      ],
      "as": "capcodes"
    }
  },
  {
    $project: {
      _id: 0,
      tijd: 1,
      melding: 1,
      capcodes: 1
    }
  }
]).exec(function (err, docs) {
  if(err) throw err;
  console.log(docs);
});

MongoPlayground

...