MongoDB 是当前 Web 应用开发中非常重要的 NoSQL 数据库之一,在前端开发中使用 MongoDB 存储和操作数据是很普遍的。本文将介绍 MongoDB 如何修改文档,包括实现方式和技巧。
MongoDB 修改文档的两种方法
MongoDB 中可以通过更新操作和替换操作来修改文档,下面将分别介绍。
更新操作
更新操作只会修改文档的部分 field 数据,而不会替换整个文档。MongoDB 支持一系列的更新操作符,例如 $set、$inc、$push、$addToSet、$pull 等,我们可以根据需要选择相应的操作符进行使用。
$set:用于设置文档的 field 值,如果文档中不存在该 field,则会新增该 field。$inc:用于将 field 作为数字进行增加或减少。$push:用于将值添加到 array 中。$addToSet:用于将值添加到 set 中,如果值已经存在,则不会重复添加。$pull:用于从 array 或 set 中根据条件删除符合条件的值。
示例:
假设有以下文档:
{
_id: ObjectId("617a2900ba7b6d9dbdf39a99"),
name: "Tom",
age: 25,
scores: [80, 90, 85],
hobbies: ["hiking", "reading"]
}我们可以通过以下代码更新文档:
db.users.updateOne(
{ _id: ObjectId("617a2900ba7b6d9dbdf39a99") },
{ $set: { age: 26 } }
);该代码将会将文档中 _id 为 ObjectId("617a2900ba7b6d9dbdf39a99") 的文档的 age field 修改为 26。
替换操作
替换操作会将整个文档替换为新的文档,需要注意的是,替换操作不会保留原有的 field,如果不希望丢失原有数据,需要先查询出原有数据,然后修改后再进行替换操作。
示例:
假设有以下文档:
{
_id: ObjectId("617a2900ba7b6d9dbdf39a99"),
name: "Tom",
age: 25,
scores: [80, 90, 85],
hobbies: ["hiking", "reading"]
}我们可以通过以下代码替换文档:
// www.javascriptcn.com code example
db.users.replaceOne(
{ _id: ObjectId("617a2900ba7b6d9dbdf39a99") },
{
name: "Tom",
age: 26,
scores: [75, 85, 95],
hobbies: ["reading", "swimming"]
}
);该代码将会将文档中 _id 为 ObjectId("617a2900ba7b6d9dbdf39a99") 的文档替换为新文档,新文档中的 field 可以和原有文档中的 field 不同。
MongoDB 修改文档的技巧
操作符的组合使用
在实际开发中,我们经常会需要修改文档中的多个 field,此时我们可以使用 $set、$inc 等操作符的组合使用来修改多个 field。
db.users.updateOne(
{ _id: ObjectId("617a2900ba7b6d9dbdf39a99") },
{
$set: { age: 26, name: "Jerry" },
$inc: { score: 10 }
}
);该代码将会将文档中 _id 为 ObjectId("617a2900ba7b6d9dbdf39a99") 的文档的 age 修改为 26,name 修改为 "Jerry",score 值增加 10。
部分修改
在某些情况下,文档中的某个 field 可能只需要修改其中一部分,此时我们可以使用 $ 操作符对数组和嵌套文档的 field 进行部分修改。
db.users.updateOne(
{ _id: ObjectId("617a2900ba7b6d9dbdf39a99") },
{ $set: { "scores.$[elem]": 95 } },
{ arrayFilters: [{ "elem": { $gt: 80 } }] }
);该代码将会将文档中 _id 为 ObjectId("617a2900ba7b6d9dbdf39a99") 的文档中 scores 数组中大于 80 的元素修改为 95。
结语
MongoDB 的修改操作提供了丰富的操作符和特性,可以轻松实现各种场景下的文档修改操作。掌握 MongoDB 的修改操作技巧和方法,对前端开发者来说具有重要的指导意义。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d666d7a941bf7134c25917