Как я могу заблокировать документ, чтобы прочитать значение, а затем обновить его - PullRequest
0 голосов
/ 22 апреля 2019

В моем приложении пользователи могут подписаться на событие.На каждое мероприятие допускается максимальное количество участников.При бронировании мероприятия я добавляю идентификатор пользователя в массив в документе мероприятия.Когда длина массива равна максимальному количеству участников, пользователь должен вместо этого быть добавлен ко второму массиву с резервными участниками.

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

Поскольку я новичок, я не уверен в том, как реализовать это с помощью 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 и, похоже, решил мою проблему.Просто из любопытства я был бы признателен, если бы кто-нибудь мог привести пример с блокировкой документа, если это вообще возможно.

Лучший Маркус

1 Ответ

0 голосов
/ 22 апреля 2019

Согласно официальной документации:

При изменении одного документа и метод findAndModify, и метод update () автоматически обновляют документ.См. Атомарность и транзакции для получения более подробной информации о взаимодействиях и порядке операций этих методов.

Ссылка: Прямо перед ссылкой ниже: https://docs.mongodb.com/manual/reference/command/findAndModify/#transactions

А также посмотритена стеке потока и Является ли findAndModify mongoDB "транзакция-сохранение"

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