MongoDB - 查找 - 多个集合 - 结果在一个数组中

问题描述

网站集字段 - _id,name

节点集合字段 - _id,siteId,name

设备集合字段 - _id,nodeId,name

传感器集合字段 - _id,deviceid,name

我是 MongoDB 新手,预期结果(没有重复数据):

[{
        "_id": "608aa9bd323489617cfe2081","name": "Site One two 3","node": [{
            "name": "Node Guj 3 222 ","device": [{
                "mode": 1,"siteId": "608aa9bd323489617cfe2081","nodeId": "608aa9cc323489617cfe2083","isActive": true,"_id": "608aa9ee323489617cfe2084","sensor": [{
                    "_id": "608aa9ee323489617cfe2085","name": "NVR_Channel1"
                }]
            }]
        }]
    },{
        "_id": "608aa9bd323489617cfe2083","name": "Site One two 22","device": []
        }]
    },{
        "_id": "608aa9bd323489617cfe2085","name": "SiteO","node": [{
            "name": "Node22 ","sensor": []
            }]
        }]
    }
]

正如我之前提到的,我是 MongoDB 的新手,我尝试了以下查询,但没有得到预期的结果

const result = await Site.aggregate([
        {
          $lookup:
          {
            from: "nodes",localField: "_id",foreignField: "siteId",as: "node"
          }
        },{
          $lookup:
          {
            from: "devices",localField: "node._id",foreignField: "nodeId",as: "device"
          }
        },{
          $lookup:
          {
            from: "sensors",localField: "node.device._id",foreignField: "deviceid",as: "sensor"
          }
        }
      ]);

以下是当前响应,其中 nodedevicesensor 处于同一级别,预期为站点 -> 节点 -> 设备 -> 传感器。

[{
    "_id": "608aab1016be1c11dfe77422","name": "Aivid_Site_One","node": [{
            "_id": "608b9072932b3c0cc5ab4fd0","name": "no sensort 11"
        },{
            "_id": "608b9073932b3c0cc5ab4fd1","name": "no sensort 11"
        }
    ],"device": [{
        "_id": "608b9091932b3c0cc5ab4fd2","name": "3nd floor Device"
    }],"sensor": [{
        "_id": "608b9091932b3c0cc5ab4f33","name": "sensor 1"
    }]
}]

解决方法

您可以尝试使用管道查找,

  • $lookup 带有节点并将 siteId 传递给管道
  • $match siteId 条件
  • $lookupdevices 并将 deviceId 传递给管道
  • $match deviceId 条件
  • $lookupsensors 集合
db.sites.aggregate([
  {
    $lookup: {
      from: "nodes",let: { siteId: "$_id" },pipeline: [
        { $match: { $expr: { $eq: ["$$siteId","$siteId"] } } },{
          $lookup: {
            from: "devices",let: { nodeId: "$_id" },pipeline: [
              { $match: { $expr: { $eq: ["$$nodeId","$nodeId"] } } },{
                $lookup: {
                  from: "sensors",localField: "_id",foreignField: "deviceId",as: "sensors"
                }
              }
            ],as: "devices"
          }
        }
      ],as: "nodes"
    }
  }
])

Playground

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...