如何在不删除现有数据的情况下找到ByIdAndUpdate()?

时间:2020-05-30 17:15:43

标签: javascript node.js mongodb mongoose

假设我有一个猫鼬的Person模型,如下所示:

const PersonSchema = new mongoose.Schema({
    name: String,
    address: {
        street: String,
        number: number
    }
});

然后,我有一种更新人员信息的方法,如下所示:

const updatePerson = async (req, res) => {
    const updatedPerson = await Person.findByIdAndUpdate(req.params.id, req.body, { new: true });
    return updatedPerson;
}

到目前为止,太好了。现在假设我的数据库中有此记录:

{
    "_id": "5ed2918bc96be94f130e1354",
    "name": "Freddy",
    "address": {
         "street": "Elm Street",
         "number": 42
    }
}

我想更新名称和街道,所以我发送此请求:

{ "name": "Ryu", "address": { "street": "fighter" } }

我的文档将变成这样:

{
    "_id": "5ed2918bc96be94f130e1354",
    "name": "Ryu",
    "address": { "street": "fighter" }
}

换句话说,“数字”属性已从记录中删除。由于我未在请求中提供“ number”的值,因此原始值被undefined覆盖。我可以使用.findByIdAndUpdate()方法保留现有数据吗?

我知道您可以使用.findById()完成此操作,“手动”更新所需内容,然后调用.save(),但我想如果您可以将某些选项传递给{{1 }}。

2 个答案:

答案 0 :(得分:3)

解决问题的一种方法是直接通过设置对象的值而不是将对象设置为新对象来更新对象的属性。

旧:

{ "name": "Ryu", "address": { "street": "fighter" } }

新功能:

{ "name": "Ryu", "address.street": "fighter" }

答案 1 :(得分:1)

尝试

Person.findByIdAndUpdate(req.params.id,{$set: 
{'fieldtoupdate1':newvalue1,'fieldtoupdate2':newvalue2}}).exec()