根据查询条件,更新这边也有些细节需要注意,所以在这里准备更新下细节,方便以后自己使用。
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 开启验证
|