Я использую MongoDB, и у меня есть следующие записи:
{
name: "a",
status: [
{ age: 15, closed: true},
{ age: 38, closed: true},
{ age: 42, closed: false},
]
},
{
name: "b",
status: [
{ age: 29, closed: true},
{ age: 5, closed: false},
]
}
Я хочу проверить, имеет ли предпоследний объект в статусе, например, возраст = 29.
можно ли это сделать без использования агрегация?

Вы можете использовать $массивЭлемАт и передать -2 в качестве аргумента, чтобы получить перед последним элементом (-1 представляет последний),
If negative, $arrayElemAt returns the element at the idx position, counting from the end of the array.
Пытаться:
db.col.aggregate([
{
$addFields: {
beforeLast: { $arrayElemAt: [ "$status", -2 ] }
}
},
{
$match: {
"beforeLast.age": 29
}
},
{
$project: {
beforeLast: 0
}
}
])
Обновлено: в качестве альтернативы вы можете использовать $выражение с ключевым словом пусть для определения временной переменной:
db.col.find({
$expr: {
$eq: [
29,
{
$let: {
vars: { beforeLast: { $arrayElemAt: [ "$status", -2 ] } },
in: "$$beforeLast.age"
}
}
]
}
})
@Ayoubk Мне ничего не приходит в голову, я считаю, что этот синтаксис с отрицательным индексом доступен только для оператора $arrayElemAt. Любые возможности обновления вашего монго?
я думаю, что $выражение позволяет использовать агрегатные операторы с простым поиском. мне интересно, возможно ли это?
@Ayoubk, ты прав, только что изменил мой ответ, тебе просто нужно $let с $expr, и он работает без агрегации
можно ли использовать регулярное выражение вместо равного?
@Ayoubk Сейчас мне ничего не приходит в голову, может быть, вы можете открыть еще один вопрос, и кто-то сможет вам помочь
я не могу использовать агрегат, потому что использую старую версию монго. можно ли использовать простой запрос с найти