首页 > 解决方案 > MongoDB 只更新对象中更改的字段,而不是替换整个对象

问题描述

我想更新包含 MongoDB 中对象的文档。由于更新的对象是用户提供的,我不知道他到底要改变什么。

例如,我在用户集合中有此文档:

{
  _id: 1,
  date: new Date(),
  info: {
    first_name: "a",
    last_name: "b",
    phone: "c"
  }
}

用户可以编辑 first_name 和 last_name 但不能编辑电话。

这是req.body(我从用户那里收到的输入):

{
  info: {
    first_name: "aa"
  }
}

现在,为了仅更新“info.first_name”并保留存储在 info ojbect 中的其他字段,我必须设置如下更新查询:

db.users.update({}, {$set: {"info.first_name": req.body.info.first_name}}, cb);

但是输入可以是动态的和可变的。我不知道它是否总是被更新的名字它可以是姓氏,甚至可以是其他子对象,如地址:“info.address.city”(例如)

出于这个原因,我处理这些更新是这样的:

$set: req.body

就是这样。它有效,但我对此有疑问。它替换了整个信息对象,并且不保留存储在其中的其他密钥 - 电话被删除,姓氏被删除。

有没有办法告诉 MongoDB 不要替换整个对象,而只是更新提到的那些键?

标签: node.jsmongodb

解决方案


读取数据库中的当前条目并将 req.body 分布在当前条目上会不会更容易?

// read current entry in database
let currentObject = await user.findOne({_id});

// merge current entry with changed updated key:values
let newObject = ( currentObject, ...req.body );

// write update to database
let user.findOneAndUpdate({_id}, {$set: newObject}, )

推荐阅读