通过Mongoose更新包含空字段的文档

问题描述 投票:0回答:1

我发送以下对象用于更新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用新的文件覆盖旧文档。

node.js mongodb mongoose
1个回答
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);
  });
}
© www.soinside.com 2019 - 2024. All rights reserved.