Как найти и обновить самые низкие значения для поля в запросе mongodb? - PullRequest
0 голосов
/ 05 марта 2020

Я часто выполняю запрос mon go db, чтобы найти документы с наименьшим значением для поля, а затем запускаю другой запрос для их обновления.

Например:

    Ticket.find({
    userEvent: eventData._id,
    })
    .sort( { purchasersMinimumPrice: 1 } )
    .then(data => {

    let SecureRefundRequests = data.slice(0, 6).map(e => {return (Ticket.findByIdAndUpdate({_id: e._id}, {
                    refundAttemptExpires :(Date.now() + (5*60*1000))})
                )})

    Promise.all(SecureRefundRequests)
    })

Чтобы уменьшить количество обращений к базе данных, я хочу сделать все это одним запросом.

Я играл с db.collection.update , но не могу выяснить, как использовать индекс возвращенных отсортированных документов.

Возможно ли это?

1 Ответ

0 голосов
/ 06 марта 2020

Вы не можете сделать это в одной команде обновления.

db.collection.update оценивает каждый документ отдельно, без сохранения какого-либо состояния между документами. Это означает, что вы можете найти минимальное значение в массиве, содержащемся в документе, но вы не можете сравнить значение между документами.

Вы можете улучшить производительность вашего существующего запроса, создав индекс на {userEvent:1, purchasersMinimumPrice:1, _id:1}, а также применить ограничение 6 на запрос, и проект только для _id. Вместе они позволят mongod найти 6 документов, соответствующих этому идентификатору с наименьшими значениями, и вернуть _id, необходимый для обновления без сортировки в памяти и без фактического просмотра документов, т.е. запрос полностью покрыт индекс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...