Как найти запись в вложенном массиве объектов MongoDB?

Чтобы найти запись в вложенном массиве объектов MongoDB, вам потребуется использовать операторы запросов и операторы проекции.

Предположим, у нас есть коллекция "users" со следующей структурой:

{
  "_id": ObjectId("5f7e262f5cc92c38344e5b53"),
  "name": "John",
  "email": "[email protected]",
  "address": [
    {
      "street": "123 Main St",
      "city": "New York",
      "state": "NY"
    },
    {
      "street": "456 Elm St",
      "city": "San Francisco",
      "state": "CA"
    }
  ]
}

Чтобы найти всех пользователей, у которых адрес содержит заданный город, вы можете использовать оператор $elemMatch:

db.users.find({ "address": { $elemMatch: { "city": "New York" } } })

Этот запрос найдет все записи, у которых хотя бы один объект в массиве "address" имеет поле "city" со значением "New York".

Если вы хотите найти все объекты в массиве "address" с заданным городом в независимости от остальных свойств, вы можете использовать оператор проекции $elemMatch внутри оператора $filter:

db.users.aggregate([
  {
    $project: {
      filteredAddress: {
        $filter: {
          input: "$address",
          as: "addr",
          cond: { $eq: ["$$addr.city", "New York"] }
        }
      }
    }
  }
])

Это агрегационный запрос, который создаст новое поле "filteredAddress", содержащее массив объектов из "address", где поле "city" равно "New York".

Также возможно найти записи с использованием оператора $eq без оператора $elemMatch, если вам нужно найти записи, у которых поле "city" в любом объекте в массиве "address" равно "New York":

db.users.find({ "address.city": "New York" })

Этот запрос найдет записи, у которых хотя бы один объект в массиве "address" имеет поле "city" со значением "New York".

В обоих случаях результатом будет выборка записей, у которых условие выполнено и объекты с нужными значениями найдены в массиве "address".