Как запросить MongoDB для сложных данных

#mongodb

#mongodb

Вопрос:

У меня есть таблица, структурированная следующим образом:

db.l2vpn_fdb_database.findOne()

 {
  _id: ObjectId("5f5257f11324c04122714445"),
  hostname: "spine01-drt-red",
  l2vpn_fdb_database: {
    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» для дальнейшей обработки.

Спасибо.

Ответ №1:

Вы можете использовать $filter для получения сопоставленных объектов

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

Рабочая игровая площадка Mongo

Комментарии:

1. знаете ли вы пример того, как это сделать с помощью «find»?

2. Если вам не нужны дубликаты mongoplayground.net/p/5o9QHEdtDvb это помогает. Но имейте в виду, чтобы использовать docs.mongodb.com/manual/reference/operator/projection /…

3. спасибо, а как насчет части имени хоста? допустим, у меня есть несколько имен хостов с одинаковым MacAddr (что возможно), как мне перечислить все те, у которых есть определенный MacAddr?

Ответ №2:

для имени хоста с 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']
          }
    }
  }
])
  

Ответ №3:

Этот запрос может вам помочь.

 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"
        }
      ]
    }
  }