Я пытаюсь выполнить простой поиск с помощью MongoDB, я новичок в этом, поэтому я не знаю, что не так, но кажется, что он всегда приносит все результаты без фильтрации.
Вы можете запустить код здесь и посмотреть, что происходит: https://mongoplayground.net/
Коллекция — вставьте сюда https://mongoplayground.net/ — ПЕРВАЯ текстовая область
[
{
"collection": "collection",
"count": 10,
"content": [
{
"_id": "apples",
"qty": 5
},
{
"_id": "bananas",
"qty": 7
},
{
"_id": "oranges",
"qty": {
"in stock": 8,
"ordered": 12
}
},
{
"_id": "avocados",
"qty": "fourteen"
}
]
}
]
Найти — вставить сюда https://mongoplayground.net/ — ВТОРАЯ текстовая область
db.collection.find({
"content.qty": 5
})
Проверьте результаты, и в результате вы увидите весь JSON. Что я делаю неправильно? Спасибо!
Вы можете использовать $filter
с $project
после $match
, чтобы получить только один элемент из массива:
db.collection.aggregate([
{ $match: { "content.qty": 5 }},
{
$project: {
collection: 1,
count: 1,
content: {
$filter: {
input: "$content",
as: "item",
cond: { $eq: [ "$$item.qty", 5 ]
}
}
}
}
}
])
Без раскручивания и т. д. Вы получаете все, так как $find
возвращает первый документ, который соответствует, и в вашем случае это основной документ.
Посмотрите, как это работает здесь
Во-первых, запрос возвращает то, что он должен делать. он принесет вам документ, который удовлетворяет вашему запросу, попробуйте добавить элемент или больше в массив, который вы ищете, чтобы увидеть разницу. Во-вторых, то, чего вы хотите достичь - получить только определенные элементы во вложенном массиве - можно сделать с помощью агрегации, вы можете прочитать об этом здесь: https://docs.mongodb.com/manual/aggregation/