mongo 详解修改操作

简介: 在mongo中的数组操作是不同的,会有专门的指令来进行修改.

根据查询条件,更新这边也有些细节需要注意,所以在这里准备更新下细节,方便以后自己使用。


mongodb原生


db.<collection>.updateOne(filter, update, [options]); 
db.<collection>.updateMany(filter, update, [options]); 
复制代码


filter 过滤条件


filter 是查询的过滤条件,详情请查看上一篇文章:mongo 进阶——查询


options 更新的内容


更新的以下内容是基于以下数据结构来的:


fc88efe685fa3040861a8076dd4bf81e.png


options 第二个参数决定了更新哪些字段,它的常见写法如下:


普通字段操作


$set 操作符


这个操作符号是用来设置单个字段的


// 将匹配文档的 name 设置为 邓哥,address.city 设置为 哈尔滨
{
  $set: { name:"twinkle", "address.province": "北京" }
}
// 例如: 
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{$set:{name:"twinkle", "address.province": "北京" }})
复制代码

375dddad2cc17be5a94d4ea7f4c2adc7.png


$inc


$inc 用来设置某个字段自增多少


// 将匹配文档的 name 设置为 twinkle2,并将其年龄增加2
{
  $set: { name:"twinkle2" },
  $inc: { age: 2 }
}
// 例如:
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{
  $set: { name:"twinkle2" },
  $inc: { age: 2 }
})
复制代码

69026c60a34444deb1769c152e220dd9.png


$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" }
})
复制代码


76fa57dc2224698a81d6034d5fb57e44.png


$unset


将文档的某个字段删除


// 将匹配文档的 age 字段、address.province 字段 删除
{
  $unset: {age:"", "address.province":""}
}
例如:
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{
  $unset: {age:"", "address.province":""}
})
复制代码


53410770e2a9b6a2252c3f395d06b6d1.png


数组操作


在mongo中的数组操作是不同的,会有专门的指令来进行修改.


$addToSet


若数组中不存在则进行添加 若存在则不进行任何操作


// 向 loves 添加一项:code
{
  $addToSet: {
    loves: "code"
  }
}
// 例如
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{
 $addToSet: {
    loves: "code"
  }
})
复制代码

05c8492c3be802b99ed8c684147a4699.png


$push


向数组中添加一项数据,无论数组中是否存在,都必定会添加


{
  $push: {
    loves: "code"
  }
}
// 这个和上面是一样的,都是添加
复制代码


$each


在数组中添加多项


{
  $push: {
    loves: { $each: ["game", "game2"]}
  }
}
// 例如
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{
  $push: {
    loves: { $each: ["game", "game2"]}
  }
})
复制代码

75b592bb713c8f409c7c948cf349ca89.png


$pull


删除数组的某一项或者多项


// 删除loves的code,game
{
  $pull: {
    loves: {$in: ["code","game"]}
  }
}
// 例如:
db.getCollection('students').updateOne({_id:  ObjectId("6187c759ee4ea6f22d01f45a")},{
   $pull: {
    loves: {$in: ["code","game"]}
  }
})
复制代码

f606d8b60970caad59e5ac614e0d99c4.png


.$


修改数组中某项


// 将所有loves中的 game2 修改为 game
// 该操作符需要配合查询条件使用
db.students.updateOne({
   _id:  ObjectId("6187c759ee4ea6f22d01f45a")
  loves: "game2"
}, {
  $set: {
    "loves.$": "game"
  }
})
复制代码

105038a97493d01fb9daf993bb7776dd.png


更多的操作符见:docs.mongodb.com/manual/refe…


其他配置


第三个参数是其他配置


  • upsert:默认false,若无法找到匹配项,则进行添加


// 我把id的a改成c,数据库中是没有的
db.students.updateOne({
   _id:  ObjectId("6187c759ee4ea6f22d01f45c"),
}, {
  $set: {
    "loves": "game"
  }
},{
upsert: true
})
复制代码

990d71c7c9a9ad35a8c5364249d80105.png


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开启验证
相关文章
|
3月前
|
存储 NoSQL 网络安全
修改mongodb的连接参数
在MongoDB中,你可以通过连接字符串(connection string)来配置连接参数。连接字符串是一个包含连接信息的字符串,可以包括主机地址、端口、认证信息、数据库名等。 下面是一些常见的连接参数,你可以根据需要进行修改: 1. **主机地址(host):** MongoDB服务器的地址。可以是IP地址或主机名。 ```mongodb mongodb://localhost:27017 ``` 2. **端口号(port):** MongoDB服务器的端口号。默认端口号是27017。 ```mongodb mongodb://localhost:
129 1
|
NoSQL MongoDB
MongoDB 常见问题 - 解决找不到 mongo、mongod 命令的问题
MongoDB 常见问题 - 解决找不到 mongo、mongod 命令的问题
984 0
MongoDB 常见问题 - 解决找不到 mongo、mongod 命令的问题
|
关系型数据库 MySQL
一键部署mysql 无修改直接cp 执行 100% 有效
一键部署mysql 无修改直接cp 执行 100% 有效
|
数据可视化 关系型数据库 MySQL
10章MySQL:库的创建、修改、删除
10章MySQL:库的创建、修改、删除
|
NoSQL 关系型数据库 Shell
Mongo修改数据类型
引言 本文主要讲解Mongodb的类型转换。包括:string转double, string转int, string转Date。
284 0
|
关系型数据库 MySQL
|
数据库 数据安全/隐私保护