如何查询MongoDB中的复杂数据

如何查询MongoDB中的复杂数据,mongodb,Mongodb,我的表格结构如下: db.l2vpn_fdb_数据库.findOne() { _id:ObjectId(“5f5257f11324c04122714445”), 主机名:“spine01 drt红色”, l2vpn_fdb_数据库:{ MAC:[ { IfIndex:“1631”, MacAddr:“00-00-0C-07-AC-01”, SrvID:“1”, VsiName:“EVPN”, }, { IfIndex:“0”, MacAddr:“00-00-0C-07-AC-02”, SrvID

我的表格结构如下:

db.l2vpn_fdb_数据库.findOne()

{
_id:ObjectId(“5f5257f11324c04122714445”),
主机名:“spine01 drt红色”,
l2vpn_fdb_数据库:{
MAC:[
{
IfIndex:“1631”,
MacAddr:“00-00-0C-07-AC-01”,
SrvID:“1”,
VsiName:“EVPN”,
},
{
IfIndex:“0”,
MacAddr:“00-00-0C-07-AC-02”,
SrvID:“0”,
VsiName:“EVPN”,
},
{
IfIndex:“1631”,
MacAddr:“00-00-0C-07-AC-0A”,
SrvID:“1”,
VsiName:“EVPN”,
},
],
},
}
我想搜索“MacAddr”对象,你能帮我根据上面的内容找出答案吗?所以本质上我希望能够解析数据库中的MacAddress,假设它在那个里,并且能够获取“IfIndex”进行进一步处理


谢谢。

您可以使用
$filter
获取匹配的对象

db.collection.aggregate([
  {
    $project: {
      l2vpn_fdb_database: {
        $filter: {
          input: "$l2vpn_fdb_database.MAC",
          cond: {
            $eq: [
              "$$this.IfIndex",
              "1631"
            ]
          }
        }
      }
    }
  }
])

使用

对于使用macAddr的主机名,请尝试这样做

db.collection.aggregate([
  {
    $project: {
      l2vpn_fdb_database: {
        $filter: {
          input: "$l2vpn_fdb_database.MAC",
          cond: {
            $eq: [
              "$$this.IfIndex",
              "1631"
            ]
          }
        }
      },
      hostname:{
          $eq:['$hostname','spine01-drt-red']
          }
    }
  }
])

这个查询可以帮助您

b.l2vpn_fdb_database.findOne({
  "l2vpn_fdb_database.MAC.MacAddr": "00-00-0C-07-AC-01",
},
{
  "l2vpn_fdb_database.MAC.$": 1
})
结果是相同的文档,数组中只有1个元素

结果:

{
    "_id": ObjectId("5f5257f11324c04122714445"),
    "l2vpn_fdb_database": {
      "MAC": [
        {
          "IfIndex": "1631",
          "MacAddr": "00-00-0C-07-AC-01",
          "SrvID": "1",
          "VsiName": "EVPN"
        }
      ]
    }
  }

你知道一个如何使用“查找”的例子吗?如果你不需要双倍的帮助。但是要注意使用谢谢,主机名部分呢?假设我有多个主机名具有相同的MacAddr(这是可能的),我如何列出所有具有特定MacAddr的主机名?