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 详解修改操作的主要内容,如果未能解决你的问题,请参考以下文章

mongo的安装

mongo explain分析详解

React 生命周期(新旧)及 案例

mongo-connector实现MongoDB与elasticsearch实时同步深入详解

Flex布局新旧混合写法详解(兼容微信)

Flex布局新旧混合写法详解(兼容微信)