Обновление параллелизма в mongodb - PullRequest
0 голосов
/ 01 мая 2018

Я использовал этот код на стороне сервера node.js для обновления нескольких встроенных документов.

        DetailerItemGroupModel.find({
                "_id": itemGroupId
            })
            .forEach(function (doc) {
                doc.Products.forEach(function (ch) {
                    //do something before update
                });
                DetailerItemGroupModel.save(doc);
            });

У меня есть такой сценарий: Клиент A и B выполняют HTTP-метод GET для получения одинаковых документов в одно и то же время, затем клиент B сначала выполняет обновление (вызов сервера, который запустит приведенный выше код), а затем клиент A выполняет обновление.

Поэтому я хочу, чтобы, когда клиент A выполнял HTTP-метод UPDATE на сервере, он должен был получить данные, которые были самыми последними (в данном случае документ был обновлен с помощью B), я имею в виду, как отменить запрос клиента A и вернуть неверный запрос на передачу данных. Клиент А, который будет обновлен, был изменен другим клиентом. Есть ли способ реализовать это?

Я читал о "__v", но не уверен, когда Клиенты A и B одновременно отправляют запрос на обновление одного и того же документа. Работает ли он с forEach (), я изменяю код на этот

         DetailerItemGroupModel.find({
                "_id": itemGroupId,
                "__v" : {document version}
            })
            .forEach(function (doc) {
                doc.Products.forEach(function (ch) {
                    //do some thing before update
                });
                DetailerItemGroupModel.save(doc);
            });

1 Ответ

0 голосов
/ 08 мая 2018

Идея состоит в том, что вы хотите, чтобы «Сохранить» работало только на той версии, которая у вас есть (которая должна быть самой последней).

Использование .save здесь вам не поможет.

Вы можете использовать одну из двух функций:

обновление. findOneAndUpdate

Идея в том, что вы должны найти и сохранить за одну атомную операцию. И в объекте условий вы не только отправляете _id, но также отправляете __v, который является идентификатором версии. (Что-то похожее на приведенный ниже пример)

this.update({_id: document._id, __v: document.__v}, {$set: document, $inc: {__v: 1}}, result.cb(cb, function(updateResult) {
    ...
});

Скажем, вы прочитали версию 10, теперь вы готовы обновить ее (сохранить). Он будет работать только в том случае, если найдет документ с определенным идентификатором и версией. Если в это время база данных получит более новую версию (версию 11), обновление не будет выполнено.

Кстати, у MongoDb теперь есть транзакции, вы, возможно, захотите разобраться в этом, потому что транзакция B заставит ваш код ждать, пока транзакция A не завершит свою атомарную операцию, что было бы лучшей моделью, чем обновление и сбой, а затем попытка снова ...

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