前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB干货篇之更新数据

MongoDB干货篇之更新数据

作者头像
爱撒谎的男孩
发布2019-12-31 10:58:57
6510
发布2019-12-31 10:58:57
举报
文章被收录于专栏:码猿技术专栏

文章目录

  1. 1. MongoDB干货篇之数据更新
    1. 1.1. 常用的函数
      1. 1.1.1. upsert
      2. 1.1.2. multi
    2. 1.2. 字段更新操作符 Field Update Operators
      1. 1.2.1. $set
      2. 1.2.2. $unset
      3. 1.2.3. $inc
      4. 1.2.4. $rename
    3. 1.3. 数组更新操作符 Array Update Operators
      1. 1.3.1. $ (query)
      2. 1.3.2. $push
      3. 1.3.3. $pull

MongoDB干货篇之数据更新

常用的函数

  • update(<query>,<update>,<upsert>,<multi>),其中<query>表示筛选的条件,<update>是要更新的数据
  • updateMany() 更新所有匹配到的数据

upsert

upsert是一个布尔类型的数据,如果为true时,当根据query条件没有找到匹配的数据时,就表示插入此条数据,如果为false就表示不插入数据 下面将会在一个空的集合中更新数据

代码语言:javascript
复制
//就会插入此条数据,因为没有找到匹配的信息
db.user.update({'name':'chenjiabing','age':22,'sex':"Man"},{$set:{'hobby':'read'}},{'upsert':true});  
db.user.update({'name':'chenjiabing','age':22,'sex':"Man"},{$set:{'hobby':'read'}},true);   //和上面的语句等价
//输出  db.user.find()
{ "_id" : ObjectId("59067b70856d5893a687655f"), "age" : 22, "name" : "chenjiabing", "sex" : "Man", "hobby" : "read" }

multi

如果这个参数为true,就把按条件查出来多条记录全部更新。默认为false,如果为true的话和updateMany()一样的效果 下面将会更新所有匹配到的数据

代码语言:javascript
复制
db.user.update({name:'chenjiabing'},{$set:{'hobby':'code'}},{'multi':true});

字段更新操作符 Field Update Operators

$set

$set用来指定一个键的值。如果这个键不存在,则创建它。注意这里的更新默认是只更新第一条匹配到的数据,如果第一条匹配的数据已经满足修改后的条件,那么将不会执行下面匹配的信息

  • 下面我们将会添加一条信息在数据库中
代码语言:javascript
复制
db.user.insert({"name":'jack',"age":22,"sex":'Man','school':{'name':'jsnu','city':'xuzhou'}});

运行下面的代码,将该用户的兴趣设置为“读书”并添加至文档中(此时文档中hobby键是不存在,该条文档就会创建它)

代码语言:javascript
复制
	db.user.update({name:'jack'},{$set:{'hobby':'read'}})

下面将会修改用户的年龄

代码语言:javascript
复制
	db.user.update({'name':'jack'},{$set:{'age':20}})

下面用$set修改数据类型,将sex设置为1

代码语言:javascript
复制
db.user.update({'name':'jack'},{$set:{'sex':1}})

下面用$set修改内嵌文档,必须指定文档的名字和键值

代码语言:javascript
复制
db.user.update({name:'jack'},{$set:{'school.name':'shida','school.city':'beijing'}})

$unset

从文档中移除指定的键 下面将要删除上面插入的hobby

代码语言:javascript
复制
	db.user.update({name:'jack'},{$unset:{'hobby':1}})   //这里的值是任意给的,随便什么值

$inc

$inc修改器用来增加已有键的值,或者在键不存在时创建一个键$inc就是专门来增加(和减少)数字的。$inc只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败 例如毎次有人访问该博文,该条博文的浏览数就加1,用键pageViews保存浏览数信息。这个键值上面没有定义过,所以会自动创建一个

代码语言:javascript
复制
	db.user.update({name:'jack'},{$inc:{'pageViews':1}});    //起初没有就会自动创建一个键

下面演示增加和减少

代码语言:javascript
复制
db.user.update({name:'jack'},{$inc:{'pageViews':100}})  ;  //这里是在上面的基础上加上100,此时变成了101
db.user.update({name:'jack'},{$inc:{"pageViews":-100}}) ;   //这里是在上面的基础上减去100,此时还是变成了1

$rename

语法:{$rename: { <old name1>: <new name1>, <old name2>: <new name2>, ... } } $rename操作符可以重命名字段名称,新的字段名称不能和文档中现有的字段名相同。 下面重新插入一条数据,并且改变这条数据的键的名称

代码语言:javascript
复制
db.user.insert({name:'chenjiabing','age':22,'sex':'Man','school':{'name':'jsnu','city':'beijing'}});
db.user.update({name:'chenjiabing'},{$rename:{'age':'Age'}})   //重命名age为Age

下面将要演示怎样改变内嵌文档的键的名称,注意一定要带上文档的名字

代码语言:javascript
复制
db.user.update({name:'chenjiabing'},{$rename:{'school.name':'school.Name','school.city':'school.City'}});

如果重命名的字段字和集合中原有的字段名字相同的话就会覆盖原有的字段名称,那么就会造成数据的丢失

代码语言:javascript
复制
db.user.update({name:'chenjiabing'},{'$rename':{'sex','age'}});  //这里sex变成age和原来的age相同,那么原来的age就会丢失
db.user.find({name:'chenjiabing'});  
//输出,可以看到原来的age没有了,变成了覆盖之后的
{ "_id" : ObjectId("590674ce30b9f88dd43d7ee4"), "name" : "chenjiabing", "age" : "Man", "school" : { "name" : "jsnu", "city" : "beijing" } }

如果指定的字段不存在,那么将不会更新,对原来的字段没有影响

代码语言:javascript
复制
	db.user.update({name:'chenjiabing'},{$rename:{value:'name'}});  //将不会有任何的改变,因为value这个字段根本不存在

$rename操作符也可以将子文档中键值移到其他子文档中

代码语言:javascript
复制
db.user.update({name:'chenjiabing'},{$rename:{'school.name':'contact.name'}});// 这里将会将school.name这个字段的值移到contact.name之中,如果contact不存在,那么就会创建一个
//输出
{ "_id" : ObjectId("590674ce30b9f88dd43d7ee4"), "name" : "chenjiabing", "age" : "Man", "school" : { "city" : "beijing" }, "contact" : { "name" : "jsnu" } }

数组更新操作符 Array Update Operators

只能用在键值为数组的键上的数组操作。

$ (query)

语法:{ "<array>.$" : value } 当对数组字段进行更新时,且没有明确指定的元素在数组中的位置,我们使用定位操作符$标识一个元素,数字都是以0开始的。 注意:

  • 定位操作符(“$”)作为第一个匹配查询条件的元素的占位符,也就是在数组中的索引值。
  • 数组字段必须出现查询文档中。

向集合中插入两条数据

代码语言:javascript
复制
db.students.insert({ "_id" : 1, "grades" : [ 78, 88, 88 ] });
db.students.insert({ "_id" : 2, "grades" : [ 88, 90, 92 ] });

执行下列操作

代码语言:javascript
复制
//查询匹配的文档中,数组有2个88,只更新第一个匹配的元素,也就是"grades.1"
db.students.update( { _id: 1, grades: 88 }, { $set: { "grades.$" : 82 } }) ;
//查询文档中没有出现grades字段,查询报错
db.students.update( { _id: 2 }, { $set: { "grades.$" : 82 } } );

$push

如果指定的键已经存在,会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。 下面我们将使用$push对该文档添加一条评论信息。

代码语言:javascript
复制
//将会创建一个comments数组,因为一开始这个数组没有存在
db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'jack','content':'hello thanks'}}})
//继续添加一条,在comments的末尾进行添加,此时comments变成两条数据了
db.user.update({name:'chenjiabing'},{$push:{comments:{'name':'john','content':'hello'}}})

$pull

语法db.collection.update( { field: <query> }, { $pull: { field: <query> } } ); $pull操作符移除指定字段值为数组,且匹配$pull操作符移除指定字段值为数组,且匹配$pull语句声明的查询条件的所有元素。 执行如下操作

代码语言:javascript
复制
//插入一条文档
db.profiles.insert({ votes: [ 3, 5, 6, 7, 7, 8 ] });
//移除数组中所有元素7
db.profiles.update( { votes: 3 }, { $pull: { votes: 7 } } );
//移除数组中所有大于6的元素
db.profiles.update( { votes: 3 }, { $pull: { votes: { $gt: 6 } } } );
//Result
{ votes: [ 3, 5, 6, 8 ] }
{ votes: [ 3, 5, 6 ] }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • MongoDB干货篇之数据更新
    • 常用的函数
      • upsert
      • multi
    • 字段更新操作符 Field Update Operators
      • $set
      • $unset
      • $inc
      • $rename
    • 数组更新操作符 Array Update Operators
      • $ (query)
      • $push
      • $pull
相关产品与服务
云数据库 MongoDB
腾讯云数据库 MongoDB(TencentDB for MongoDB)是腾讯云基于全球广受欢迎的 MongoDB 打造的高性能 NoSQL 数据库,100%完全兼容 MongoDB 协议,支持跨文档事务,提供稳定丰富的监控管理,弹性可扩展、自动容灾,适用于文档型数据库场景,您无需自建灾备体系及控制管理系统。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档