通过Mongoose

时间:2017-12-22 21:56:41

标签: node.js mongodb mongoose

我发送以下对象供mongoose更新:

{
  "name" : "John",
  "fruit" : "5a3d678d9b1549979d81c6ba" // this is an objectID
}

和方法:

db_user.findByIdAndUpdate(req.params.id, req.body).then(function(user, err) {
  res.send(user);
});

如果我用另一个fruitID替换水果,这是我正在尝试更新的。

但是,如果我发送没有水果的对象,它将不会从用户文档中删除水果字段。如:

{
  "name" : "John"
}

它将更新我传递的任何名称,但不会删除水果字段。为什么呢?

另外:我无法检查我正在发送的每个字段,并相应地为每个字段执行$unset,因为我发送了很多字段。我只是希望Mongoose用新的文档覆盖旧文档。

1 个答案:

答案 0 :(得分:0)

我知道这有点复杂/丑陋,我确信有一种更简单的方法,但是如果你想要更新特定的东西并且没有将其他值填入空白,这应该可行。

function updateItem(req, res) {

  function GetObjectFromKeyValuePairs(pairs) {
    var tmp = {};

    for(var key in pairs)
      if(key[0] !== "_")
        if(pairs[key].length !== 0)
          tmp[`${key}`] = `${pairs[key]}`;
    return tmp;
  }
  let updateOnlyChangedVals = GetObjectFromKeyValuePairs(req.body);

  DB.Item.update({_id: req.params.id}, {$set: updateOnlyChangedVals},{new:true}, (err, uItem) => {
    if (err) { return console.log("index error: " + err); }
    res.json(uItem);
  });
}