Этот вопрос немного отличается от других, так как мне нужно получить все документы, а не только определенные поля.
Мне нужно отфильтровать документы (все документы, а не только определенные поля) в соответствии со значением последних элементов вложенного массива. (doc.array[i].innerArray[innerArray.length - 1].desiredField
)
Документы выглядят так:
[
{
"_id": 0,
"matches": [
{
"name": "match 1",
"ids": [
{
"innerName": "1234"
},
{
"innerName": "3"
}
]
}
]
},
{
"_id": 1,
"matches": [
{
"name": "match 5",
"ids": [
{
"innerName": "123"
},
{
"innerName": "1"
}
]
},
{
"name": "match 5",
"ids": [
{
"innerName": "1"
},
{
"innerName": "1234"
},
]
},
]
}
]
Итак, если мы фильтруем в соответствии с innerName = '1234', это результат:
{
"_id": 1,
"matches": [
{
"name": "match 5",
"ids": [
{
"innerName": "123"
},
{
"innerName": "1"
}
]
},
{
"name": "match 5",
"ids": [
{
"innerName": "1"
},
{
"innerName": "1234"
},
]
}
Один из вариантов:
db.collection.find({
$expr: {
$in: [
"1234",
{$reduce: {
input: "$matches",
initialValue: [],
in: {$concatArrays: ["$$value", [{$last: "$$this.ids.innerName"}]]}
}
}
]
}
})
Посмотрите, как это работает на примере детской площадки
Получил это, используя оператор $or внутри $expr, еще раз спасибо!
Другой вариант:
db.collection.aggregate([
{
$match: {
$expr: {
$gt: [
{
$size: {
$filter: {
input: "$matches",
cond: {
$in: [
{
$last: "$$this.ids.innerName"
},
[
"1234"
]
]
}
}
}
},
0
]
}
}
}
])
Объяснение:
Соответствовать только документам, в которых размер массива > 0, для тех, у кого в последнем вложенном элементе массива есть «1234».
Спасибо! Это работает, но забыл упомянуть, что find
больше подходит для моего варианта использования, поэтому я выберу ответ ниморда.
Это решение может работать и с find
- например, это
Спасибо! Мне нужно прочитать документы, чтобы понять, что здесь происходит :) Мне нужно получить результаты по нескольким параметрам, например: «1234» ИЛИ «3», возможно ли это внутри $expr?