mongo 详解修改操作
Posted twinkle||cll
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongo 详解修改操作相关的知识,希望对你有一定的参考价值。
根据查询条件,更新这边也有些细节需要注意,所以在这里准备更新下细节,方便以后自己使用。
mongodb原生
db.<collection>.updateOne(filter, update, [options]);
db.<collection>.updateMany(filter, update, [options]);
复制代码
filter 过滤条件
filter
是查询的过滤条件,详情请查看上一篇文章:mongo 进阶——查询
options 更新的内容
更新的以下内容是基于以下数据结构来的:
options
第二个参数决定了更新哪些字段,它的常见写法如下:
普通字段操作
$set 操作符
这个操作符号是用来设置单个字段的
// 将匹配文档的 name 设置为 邓哥,address.city 设置为 哈尔滨
$set: name:"twinkle", "address.province": "北京"
// 例如:
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),$set:name:"twinkle", "address.province": "北京" )
复制代码
$inc
$inc
用来设置某个字段自增多少
// 将匹配文档的 name 设置为 twinkle2,并将其年龄增加2
$set: name:"twinkle2" ,
$inc: age: 2
// 例如:
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$set: name:"twinkle2" ,
$inc: age: 2
)
复制代码
$mul
用来设置某个字段自乘多少
// 将匹配文档的 name 设置为 twinkle,并将其年龄乘以2
$set: name:"twinkle" ,
$mul: age: 2
// 这个和简单,和上面加一样的
复制代码
$rename
将文档的某个字段从新名命,这个在mysql中可不存在哦
// 将匹配文档的 name 字段修改为 fullname
$rename: name: "fullname"
// 例如:
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$rename: name: "fullname"
)
复制代码
$unset
将文档的某个字段删除
// 将匹配文档的 age 字段、address.province 字段 删除
$unset: age:"", "address.province":""
例如:
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$unset: age:"", "address.province":""
)
复制代码
数组操作
在mongo中的数组操作是不同的,会有专门的指令来进行修改.
$addToSet
若数组中不存在则进行添加 若存在则不进行任何操作
// 向 loves 添加一项:code
$addToSet:
loves: "code"
// 例如
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$addToSet:
loves: "code"
)
复制代码
$push
向数组中添加一项数据,无论数组中是否存在,都必定会添加
$push:
loves: "code"
// 这个和上面是一样的,都是添加
复制代码
$each
在数组中添加多项
$push:
loves: $each: ["game", "game2"]
// 例如
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$push:
loves: $each: ["game", "game2"]
)
复制代码
$pull
删除数组的某一项或者多项
// 删除loves的code,game
$pull:
loves: $in: ["code","game"]
// 例如:
db.getCollection('students').updateOne(_id: ObjectId("6187c759ee4ea6f22d01f45a"),
$pull:
loves: $in: ["code","game"]
)
复制代码
.$
修改数组中某项
// 将所有loves中的 game2 修改为 game
// 该操作符需要配合查询条件使用
db.students.updateOne(
_id: ObjectId("6187c759ee4ea6f22d01f45a")
loves: "game2"
,
$set:
"loves.$": "game"
)
复制代码
更多的操作符见:docs.mongodb.com/manual/refe…
其他配置
第三个参数是其他配置
upsert
:默认false
,若无法找到匹配项,则进行添加
// 我把id的a改成c,数据库中是没有的
db.students.updateOne(
_id: ObjectId("6187c759ee4ea6f22d01f45c"),
,
$set:
"loves": "game"
,
upsert: true
)
复制代码
mongoose
方式1:直接使用函数进行更新
<Model>.updateOne(filter, doc, [options]);
<Model>.updateMany(filter, doc, [options]);
复制代码
方式2:在模型实例中进行更新,然后保存
const u = await Students.findById("6187c759ee4ea6f22d01f45c");
u.address.province = "北京";
u.happys.push("game", "code");
await u.save(); // 此时会自动对比新旧文档,完成更新
复制代码
这种方式与原生的区别:
_id
可以直接使用字符串进行匹配doc
中可以省略$set
,直接更改即可(可以直接用js的代码来进行修改)- 默认情况下,不会触发验证,需要在模型的
options
中设置runValidators: true
开启验证
以上是关于mongo 详解修改操作的主要内容,如果未能解决你的问题,请参考以下文章