【问题标题】:Update Document including empty fields via Mongoose通过 Mongoose 更新包含空字段的文档
【发布时间】:2018-06-05 11:31:09
【问题描述】:

我正在发送以下对象以供 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】:

我知道这有点复杂/丑陋,我相信有一种更简单的方法,但如果你想更新特定的东西并且不让它填充其他值空白,这应该可以工作。

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);
  });
}

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 2021-06-21
    • 2018-10-09
    • 2011-10-17
    • 2017-03-07
    • 2017-06-27
    • 2015-10-05
    • 2021-10-19
    • 1970-01-01
    相关资源
    最近更新 更多