MongoDB возвращает только соответствующий элемент во вложенном массиве документов

У меня есть следующие данные в моей базе данных монго:

[
   { item: "journal", instock: [ { warehouse: "A", qty: 5 }, { warehouse: "C", qty: 15 } ] },
   { item: "notebook", instock: [ { warehouse: "C", qty: 5 } ] },
   { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "G", qty: 15 } ] },
   { item: "planner", instock: [ { warehouse: "A", qty: 40 }, { warehouse: "B", qty: 5 } ] },
   { item: "postcard", instock: [ { warehouse: "B", qty: 15 }, { warehouse: "G", qty: 35 } ] }
]

Я хочу найти все соответствующие документы со складом как G. Массив instock должен содержать только соответствующий элемент. В основном вывод должен выглядеть следующим образом:

[{ item: "paper", instock: [  { warehouse: "G", qty: 15 } ] },
 { item: "postcard", instock: [  { warehouse: "G", qty: 35 } ] }
]

Я написал ниже запрос:

db.collection_name.find({"instock.warehouse":"G"});

Приведенный выше запрос возвращает требуемые документы, но дает все элементы массива instock, которые мне не нужны.

Как я могу написать такой запрос, который дает мне нужные документы только с соответствующими элементами массива instock?

Спасибо!:)

Отвечает ли это на ваш вопрос? Получить только запрошенный элемент в массиве объектов в коллекции MongoDB

rickhg12hs 14.11.2022 12:57
Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
1
129
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать этот конвейер агрегации:

  • Сначала $match получить только документы, в которых существует хотя бы одна буква «G» в массиве (обратите внимание, что только этот шаг похож на поиск, который вы делаете).
  • А использование$set для перезаписи поля instock только значениями, соответствующими фильтру «склад равен G».
db.collection.aggregate([
  {
    "$match": {
      "instock.warehouse": "G"
    }
  },
  {
    "$set": {
      "instock": {
        "$filter": {
          "input": "$instock",
          "cond": {
            "$eq": [
              "$$this.warehouse",
              "G"
            ]
          }
        }
      }
    }
  }
])

Пример здесь

Также обратите внимание, что вы можете использовать $elemMatch с запросом find, но будьте осторожны, потому что $elemMatch возвращает только один элемент.

Проверьте этот пример где я добавил новый склад в "бумагу", но он не отображается, но отображается с использованием предыдущего запроса агрегации.

Другие вопросы по теме