【问题标题】:MongoDB project functionMongoDB项目功能
【发布时间】:2020-02-25 08:23:24
【问题描述】:

我在创建 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"
      }
    ]
  }
]

但这就是我要找的...

我有这样一个想法,我可以用 Mongo 的 $project 函数最好地解决这个问题,但我不知道如何......提前谢谢!

数据库结构

编辑于上午 12:59

嗯,我找到了一种可能会有所帮助的方法。来自 MongoDB 的 $concat 功能.. 但我无法让它工作

【问题讨论】:

  • 如果您使用的是 MongoDB,请确认 >=v3.6
  • 使用 MongoDB 版本:4.2.3 :-)

标签: mongodb mongoose aggregation-framework


【解决方案1】:

试试这个:

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

【讨论】:

  • 非常感谢
  • 如果我想从“学科”表中添加两个额外的字段,我需要在哪里定义它们?它涉及“Afkorting”和“meldingbenaming”行。查看带有数据库结构的图像。
  • @Simon 你的意思是this
  • 好的,谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2011-10-29
  • 2018-11-30
  • 2018-10-17
相关资源
最近更新 更多