Проверка обновлений массива Mongoose с помощью JSON Patch

В настоящее время я создаю API, который использует спецификацию исправления JSON для частичного обновления MongoDB с использованием ORM Mongoose.

Я использую модуль узла mongoose-json-patch для применения исправлений к своим документам. вот так:

var patchUpdate = function(req,  res){
  var patches = req.body;
  var id = req.params.id;
  User.findById(id, function(err, user){
    if(err){ res.send(err);}
    user.patch(patches, function(err){
      if(err){ res.send(err);}
      user.save(function(err){
        if(err) {res.send(err);}
        else {res.send("Update(s) successful" + user);}
      });
    });
  });
};

Мои основные проблемы возникают, когда я пытаюсь удалить или заменить элементы массива синтаксисом исправления JSON:

var patches = [{"op":"replace", "path": "/interests/0", "value":"Working"}]

var user = {
    name: "Chad",
    interests: ["Walking", "Eating", "Driving"]
}

Это должно заменить первый элемент в массиве («Прогулка») новым значением («Работа»), однако я не могу понять, как проверить, что на самом деле заменяется. Если другой запрос удалил /interests/0 до применения патча, «Еда» будет заменена на «Работа» вместо «Ходьба», которая больше не будет существовать в массиве.

Хотелось бы быть уверенным, что если клиент думает, что редактирует "Хождение", то он либо успешно редактирует, либо как минимум выдает ошибку.


person lattice    schedule 18.04.2016    source источник
comment
ты смог это решить?   -  person MorningDew    schedule 09.03.2017


Ответы (1)


Столкнувшись с такой же проблемой, как эта, я поделюсь своим решением. Спецификация (описанная здесь) описывает шесть операций, одна из которых — проверка. Источник описывает тестовую операцию как

Проверяет, установлено ли указанное значение в документе. Если тест не пройден, то патч в целом применяться не должен.

Чтобы убедиться, что вы меняете ожидаемые значения, вы должны проверить состояние данных. Вы делаете это, предваряя операцию замены или удаления тестовой операцией, где значение равно ожидаемому состоянию данных. Если тест не пройден, следующие операции выполняться не будут.

При тестовой операции ваши данные патча будут выглядеть так:

var patches = [
  {"op":"test", "path": "/interests/0", "value": currentValue}, //where currentValue is the expected value
  {"op":"replace", "path": "/interests/0", "value":"Working"}
]
person Roland    schedule 21.05.2018