В моем приложении пользователи могут подписаться на событие.На каждое мероприятие допускается максимальное количество участников.При бронировании мероприятия я добавляю идентификатор пользователя в массив в документе мероприятия.Когда длина массива равна максимальному количеству участников, пользователь должен вместо этого быть добавлен ко второму массиву с резервными участниками.
Меня беспокоит то, что при большом количестве одновременных бронирований событие может быть перебронировано, еслизапись одного бронирования происходит после того, как другое бронирование прочитало фактический размер массива, а затем само добавило пользователя к событию.
Поскольку я новичок, я не уверен в том, как реализовать это с помощью mongodb.Лучшее, что я думаю, было бы, если бы я мог заблокировать документ, когда началось чтение, и разблокировать его, когда запись закончилась.Я искал блокировку документа на mongodb, но не нашел примеров.Возможно, я использовал неправильные термины.Я также нашел findAndModify
, но без подсказки, если этот метод решит мою проблему.
...
const module = await Modules.findOne({ _id: args.moduleId });
if (!module.participantsIds ||
module.participantsIds.length < module.maxParticipants) {
updateAction = {
$addToSet: { "participantsIds": userId }
};
} else {
updateAction = {
$addToSet: {
"standByParticipants": {
"participantId": userId, "timeStamp": new Date()
}
}
};
}
await Modules.update(
//query
{
_id: args.moduleId
},
//update
updateAction,
//options
{
"multi": false,
"upsert": false
}
);
...
Было бы замечательно, если бы кто-то мог направить меня в правильном направлении или дать подсказку, как решить эту проблему.
Обновление: ответ Кришны Прасада ниже разъяснил мне использование findAndModify и, похоже, решил мою проблему.Просто из любопытства я был бы признателен, если бы кто-нибудь мог привести пример с блокировкой документа, если это вообще возможно.
Лучший Маркус