使用JSON修补程序验证Mongoose数组更新

时间:2016-04-18 18:56:20

标签: mongodb express mongoose json-patch

我目前正在构建一个使用JSON补丁规范的API,使用Mongoose ORM对MongoDB进行部分更新。

我正在使用节点模块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"]
}

这应该用新值替换数组中的第一项(" Walking")(" Working")但是我无法弄清楚如何验证实际上正在被取代。如果在应用补丁之前删除了另一个请求/ interest / 0," Eating"将被" Working"取代而不是" Walking",它将不再存在于数组中。

我想确保如果客户认为他正在编辑" Walking",那么他将成功编辑它,或者至少会出错。

1 个答案:

答案 0 :(得分:1)

在遇到同样的问题后,我会分享我的解决方案。规范(描述here)描述了六个操作,其中一个是测试。源将测试操作描述为

  

测试在文档中设置指定的值。如果测试失败,那么整个补丁不应该适用。

为了确保您正在更改您期望的值,您应该验证数据的状态。您可以通过使用测试操作替换或删除操作来执行此操作,其中值等于预期的数据状态。如果测试失败,则不会执行以下操作。

通过测试操作,您的补丁数据将如下所示:

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