У меня есть следующие данные в моей базе данных монго:
[
{ 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?
Спасибо!:)
Вы можете использовать этот конвейер агрегации:
$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
возвращает только один элемент.
Проверьте этот пример где я добавил новый склад в "бумагу", но он не отображается, но отображается с использованием предыдущего запроса агрегации.
Отвечает ли это на ваш вопрос? Получить только запрошенный элемент в массиве объектов в коллекции MongoDB