我发送以下对象用于更新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用新的文件覆盖旧文档。
我知道这有点复杂/丑陋,我确信有一种更简单的方法,但是如果你想要更新特定的东西并且没有将其他值填入空白,这应该可行。
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);
});
}