在使用Mongoose进行MongoDB数据库的操作时,我们经常需要更新或者修改某个文档,而在更新文档时往往需要保留原来文档中的某些字段或者属性,同时需要新增或者修改部分属性或者字段。 下面将会介绍如何在Mongoose操作中更新一个文档并避免覆盖原来的数据。
1. Mongoose Model 的 updateOne 方法
在Mongoose中,Model提供了updateOne方法来更新一个文档。updateOne方法有以下几个参数:
- filter: 更新的过滤条件
- update: 要更新的数据
- options: 更新时的一些配置项,比如是否返回更新后的文档
下面来看一个例子,我们要更新一个叫“student”的集合中学号为“001”的学生信息,同时需要保留原来的学生姓名。
-- -------------------- ---- ------- ----- ------- - ------------------------- - ------ ------- ----- ------- ---- ------- ------- ------- --- ----- ------ - - ------ ----- -- ----- ------ - - ---- -- -- ----- ------- - - ---- ----- ----------- - ----- - -- -- ------------------ ------- ------- -------- - --------- -- - ----------------- -- ---------- -- - ------------------------- ---
在以上代码中,我们首先定义了一个Mongoose的Model,名为“Student”(相当于一个集合)。然后我们定义了三个变量:filter,update和options。
- filter: { stuNo: '001' },表示我们要更新的学生的学号为“001”;
- update: { age: 18 },表示我们需要更新的学生的年龄为18岁;
- options: { new: true, projection: { name: 1 } },其中new: true表示我们希望返回更新后的文档,projection: { name: 1 }表示我们希望返回的文档中只包含name属性。
运行以上代码后,我们可以看到控制台输出为:
{ _id: 614f788ce8ebb475945a58d0, name: '小明' }
可以看到返回的数据只有更新后的值和原来保留的name属性。
2. 使用 $set 操作符更新文档中的部分字段
$set 操作符可以用来更新文档中的部分字段,非更新的字段将保持原来的值不变。
下面来看一个例子:
-- -------------------- ---- ------- ----- ------ - - ------ ----- -- ----- ------ - - ----- - ---- -- - -- ----- ------- - - ---- ----- ----------- - ----- - -- -- ------------------ ------- ------- -------- - --------- -- - ----------------- -- ---------- -- - ------------------------- ---
在以上代码中,我们使用了$set操作符来更新文档的age字段。$set操作符将仅仅更新age字段,其他字段将保持原有的值。可以看到控制台输出为:
{ _id: 614f788ce8ebb475945a58d0, name: '小明' }
可以看到返回的数据仅仅包含 name 字段和 age 字段的值。
3. 使用 Mongoose 的 findById 方法更新文档
如果我们要根据文档的 _id 来进行更新操作,我们可以使用 Mongoose 的 findById 方法来实现。
-- -------------------- ---- ------- ----- -- - --------------------------- ----- ------ - - ----- - ---- -- - -- ----- ------- - - ---- ----- ----------- - ----- - -- -- -------------------------- --- ------- -------- - --------- -- - ----------------- -- ---------- -- - ------------------------- ---
在以上代码中,我们要更新的文档对应的 _id为'614f788ce8ebb475945a58d0',其他配置项同上面讲解的一样。控制台输出为:
{ _id: 614f788ce8ebb475945a58d0, name: '小明' }
4. 总结
在使用Mongoose进行文档的更新操作时,我们可以通过Model的updateOne方法,使用$set操作符或者findByIdAndUpdate方法来实现。其中,使用$set操作符可以实现只更新部分字段而不覆盖原有的值,很实用。
以上内容是关于Mongoose中更新文档时如何避免覆盖原来的数据的详细介绍和指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f2d332f6b2d6eab3c65139