Запросить последний объект в массиве

Я использую 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.
можно ли это сделать без использования агрегация?

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

Ответы 1

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

Вы можете использовать $массивЭлемАт и передать -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"
                }
            }
        ]
    }
})

я не могу использовать агрегат, потому что использую старую версию монго. можно ли использовать простой запрос с найти

Ayoub k 11.03.2019 22:13

@Ayoubk Мне ничего не приходит в голову, я считаю, что этот синтаксис с отрицательным индексом доступен только для оператора $arrayElemAt. Любые возможности обновления вашего монго?

mickl 11.03.2019 22:16

я думаю, что $выражение позволяет использовать агрегатные операторы с простым поиском. мне интересно, возможно ли это?

Ayoub k 11.03.2019 22:23

@Ayoubk, ты прав, только что изменил мой ответ, тебе просто нужно $let с $expr, и он работает без агрегации

mickl 11.03.2019 22:26

можно ли использовать регулярное выражение вместо равного?

Ayoub k 11.03.2019 23:00

@Ayoubk Сейчас мне ничего не приходит в голову, может быть, вы можете открыть еще один вопрос, и кто-то сможет вам помочь

mickl 11.03.2019 23:13

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