MongoDb进阶实践之五 MongoDB修改命令详述


一、引言

         上一篇文章我们已经详细介绍了MongoDB数据库的有关查询的内容,但是这只是所有查询命令的冰山一角。所有查询命令都写完也没有必要,我只是写了一些常用的命令,对MongoDB的操作有一个基本的认识,如果大家想继续深入,可以根据自己的需要深入学习其他的命令。今天要讲一些和更新、修改有关系的语句、命令或者方法,当然不可能是所有的命令了,也只是一些常用的命令。我提供给大家一个基础,大家可以继续深入,我也会继续深入学习的。废话不多说,马上开始我们今天的写作吧。

二、MongoDB有关修改的详解

          我比较直接,还是直接来内容吧,有关修改的每个方法都有示例代码,应该不是很难,希望能起到抛砖引玉的作用吧。

            1、update() 方法

                    1.1、update() 方法用于更新已存在的文档。语法格式如下:

                         db.collectionName.update(
                            <query>,
                            <update>,
                            {
                              upsert: <boolean>,
                              multi: <boolean>,
                              writeConcern: <document>
                             }
                          )

                         参数说明:

                             query : update的查询条件,类似sql update查询内where后面的。

                             update : update的对象和一些更新的操作符(如$set,$inc...)等,也可以理解为sql update查询内set后面的

                             upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入新的文档,true为插入,默认是false,不插入。

                             multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。

                             writeConcern :可选,抛出异常的级别。


                    1.2、示例代码
                         

                          
                          > db.students.find({"name":FangShiYu"})
                          { _id" : ObjectId(5ab9de223afa6504457050e2")," : ",1)">age22,1)">sex1,1)">schoolZheJiangDaXueaddressGuangDongGuangZhou }

                          //修改【name】是【FangShiYu】的【age】字段的值为【25】
                          > db.students.update({"},{$set":{25}})
                          WriteResult({ nMatchednUpserted0,1)">nModified1 })

                          > db.students.find({})
                         { 25,1)">" }

 

            2、$set 修改器:针对指定字段设置指定的值,修改字段的值

                   语法:db.collectionName.update({query},{"$set":{<key>:<value>}})

                   参数说明:

                          query:查询条件

                          key:要操作的字段名

                          value:要给key字段赋的值


                     在MongoDB数据库中通过 $set 修改器和 update()方法配合使用,起到修改指定字段的作用。


                     2.1、示例代码:

                          > db.students.find({ }
                          > 



            2、$inc 修改器:在数值字段在原有的基础上再增加指定的数值,其值可以是正数,也可以是负数,负数是减多少

                   语法:db.collectionName.update({query},{"$inc":{<key>:number}})

                   参数说明:

                          query:查询条件

                          key:要操作的字段名

                          number:增加的数量,可以是正数也可以是负数,正数相加,负数相减


                     在MongoDB数据库中通过 $inc 修改器和 update()方法配合使用,起到让数值字段在原有的基础上增加指定的数值的作用。                    


                     2.1、示例代码:【age】字段在原有基础上加 【正数:1】

                         > db.students.find({ }

                         修改【name】是【FangShiYu】的【age】字段的值,让其值增加1,最受值为【26】
                         > db.students.update({$inc}})
                         WriteResult({  })

                         > db.students.find({})
                        { 26,1)"> }
                         > 



                     2.2、示例代码:【age】字段在原有基础上加 【负数:-5】

                         > db.students.find({ }


                         > db.students.update({":-521,1)"> }
                         > 



            3、$push 修改器:针对指定的字段插入文档列表,如果该字段不存在,会建立该字段并插入内文档容,如果存在,就向该字段的列表里追加文档内容。例如:留言板

                   documents={document}

                   语法:db.collectionName.update({query},{"$push":{<key>:document}})

                   参数说明:

                          query:查询条件

                          document:一个文档对象

                          key:要操作的字段名


                     在MongoDB数据库中通过 $push 修改器和 update()方法配合使用,起到留言板的效果,比如:多个人可以给某一个女生留言,每条留言就是一个文档,多个文档组成列表


                     2.1、示例代码:【messages】集合中原来没有【comments】字段

                         原始记录
                         > db.messages.find()
                        { 5abdc29b678c8239350e8a20peny0 }

                        > query={tomsayi love u!}
                        {  }

                        > db.messages.update({$pushcomments:query}})
                        WriteResult({  })

                        网【messages】集合中增加了【comments】字段,并增加了一个列表,也可以说数组
                        >" : [ {  } ] }
                        > 


                     2.2、示例代码:在【messages】集合基础上继续向【comments】字段追加文档内容

                          db.messages.find()
                         {  } ] }

                         > query={jimi want to know you!}
                         {  }

                         > db.messages.update({:query}})
                         WriteResult({  })

                         >" },{  } ] }
                         > 



             4、$each 修改器: $each 修改器、$push 修改器必须组合使用,可以一次增加由多个文档组成的列表,字段有,就追加文档,没有就创建该字段并增加一个由多个文档组成的列表数据

                   documents=[{document1},{document2},{document3}....{documentn}]

                   语法:db.collectionName.update({query},{"$push":{<key>:{"$each":documents}}})

                   参数说明:

                          query:查询条件

                          documents:文档列表,也可以称文档数组

                          key:要操作的字段名


                     在MongoDB数据库中通过 $each 修改器、$push 修改器 和 update()方法配合使用,起到的作用类似一次插入由多个文档组成的列表。


5abdc844678c8239350e8a21 } >query=[{hello!jackeyjerryi want u}]; [ { , },{ } ] > db.messages.update({$each:query}}}) WriteResult({ }) >                     2.2、示例代码:在【messages】集合基础上继续向【comments】字段追加文档内容

                          } ] }


                         > query=[{jasoni know you!bobi miss you!}];
                         [
                                  {
                                          
                                  }
                          ]


                         > db.messages.update({:query}}})
                         WriteResult({  })

                         追加了文档数据
                         > } ] }
                         > 



             5、$slice 修改器:控制记录保存的条数,如果以前有多条会把以前的清空保存条件所规定的记录,如果操作的字段不存在,就会创建该字段

                   documents=[{document1},{$push:{<key>:{$each:documents,$slice:number}}})

                   参数说明:

                          query:查询条件

                          documents:文档列表,也可以称文档数组

                          key:要操作的字段名

                          number:控制显示的数量,正数保留最早的number条记录,负数保留最新的number条记录


                     2.1、示例代码:【messages】集合中原来没有【comments】字段

                         5abdceca678c8239350e8a2218,1)"> }


                         > var query=[{lileihellohanmeimeii miss ui watch umonsterghost}];

                         保存最早的两条记录,也就是【name】分别是:lilei和hanmeimei
                         > db.messages.update({":{$each:query,$slice:2}}})

                         WriteResult({  })


                         > } ] }
                         > 


                     2.2、示例代码:在【messages】集合基础上向【comments】字段文档内容

                          } ] }

                          > }];

                          只会保留最新的记录,也就是【name】的值是:monster的文档
                          > db.messages.update({}}})
                          WriteResult({ " : - })


                          >" : [ {}] }
                          > 



             6、$addToSet 修改器:当插入一个数组时,如果数组中有重复记录,只会直插入一条,不会重复插入,会过滤掉重复的记录

                   documents=[{document1},{document3}...{documentn}]

                   语法:db.collectionName.update({query},{"$addToSet":{<key>:{"$each":documents}}})

                   
                   参数说明:

                         query:查询条件

                         documents:要插入的文档数组,也可以称作是列表,其中可以包含重复的文档

                         <key>:表示要插入数组列表的字段


                   代码实例:

                        原始数据
                        > db.messages.find()
                       { 5ac5b03525eb395526dc108d0 }

                        定义要插入的文档数组,里面有重复记录,只有最后一个文档不同
                        > var documents=[{hi}];


                        执行更新成功
                        > db.messages.update({$addToSet:documents}}});
                        WriteResult({  })


                        查询结果,值插入两条记录
                        > } ] }
                        > 



             7、$pop修改器【删除】:从数组中进行向前删除或者向后删除,+1正数表示从尾部开始删除,-1负数表示从头开始删除。

                   语法:db.collectionName.update({query},{"$pop":{<key>:1(从后开始删除)/-1(从头开始删除)}})  

                   参数说明:

                         query:查询条件

                         <key>:表示要执行删除操作的字段名,该字段必须是数组字段

                         1(从后开始删除)/-1(从头开始删除),只能是数字1和-1,其他值非法


                   代码实例:

                         db.messages.find()
{ hi1hi2hi3hello5 } ] }
                       执行删除操作,并且执行成功
                       > db.messages.update({$pop}})
                       WriteResult({  })


                       执行结果,把comments数组的第一个元素删除了
                       >" } ] }



             8、$pull修改器【删除】:根据指定条件删除数组字段里面的指定文档数据,pop只能删除头部或者尾部的数据

                   语法:db.collectionName.update({query},{"$pull":{<key>:{query2}}})
                  
                   参数说明:

                         query:查询条件

                         documents:要插入的文档数组,也可以称作是列表,其中可以包含重复的文档

                         <key>:表示要执行删除操作的字段名,该字段必须是数组字段

                         query2:查询数组字段中指定文档数据的查询条件
                  

                   } ] } 执行删除操作,并且执行成功 > db.messages.update({$pull}}}) WriteResult({ 结果数据,已经删除了说话内容是“hi2”的文档 >" } ] }



             9、下标操作符

                   9.1、根据查询条件,确定要修改的记录,然后对数组字段中第n(索引值是n-1)个文档的指定指定字段进行值的修改

                        语法:db.collectionName.update({query},{"$set":{<key>.index.<key2>:<vlaue>}})

                        参数说明:

                              query:查询条件,确定需要修改的文档

                              $set:修改器,对某个字段进行赋值

                              <key>:表示要执行操作的字段名,该字段必须是数组字段,是顶级字段名

                              index:数组字段中包含多个文档,每个文档都对应这个一个具体的下标,不要过界,下标值从0开始,如:comments字段是留言板,该字段里面包含了5个文档,每个文档都是一份具体的留言内容,如果想引用数组字段中的某一个文档,可以通过下标,comments.0.say,表示comments字段里面第一份留言say的内容是什么。

                              key2:具有指定下标值的文档数据的字段名,这个字段的值将会被修改

                              value:把value表示的内容赋给key2所表示的字段


                        示例代码:

                            原始数据
                            > db.messages.find()
                           {  } ] }


                            需要修改【comments】字段里面下标为【2】的【say】字段的值,修改成功
                            > db.messages.update({comments.2.sayi am modifing!}})
                            WriteResult({  })


                            修改成功
                            >修改【comments】字段下标是【1】的【say】字段的值
                            > db.messages.update({comments.1.say" } ] }



                   9.2、$ 操作符,是一个通配符,可以操作所有符合条件的记录(待测试

                        语法:db.collectionName.update({query},{"$set":{<key>.$.<key2>:<vlaue>}})

                        参数说明:

                              query:查询条件,确定需要修改的文档

                              $set:修改器,进行赋值操作

                              <key>:表示要执行操作的字段名,该字段必须是数组字段,是顶级字段名

                              $:是指数组字段中所有的文档,不会特指某一个文档

                              key2:具有指定下标值的文档数据的字段名,这个字段就是被修改的

                              value:把value表示的内容赋给key2所表示的字段


                        示例代码:

                             原始数据

                             > db.students.find()
                            { 5ac70d2f7a05450cf60c6887i'm changingi love y } ] }


                             修改留言板里名称是【name】是【bob】的文档,把【say】字段的内容修改为【I'm a robbot】
                             > db.students.update({comments.namecomments.$.sayI'm robbot}})
                             WriteResult({  })
                             >

                             修改结果
                             >" } ] }



             10、upsert 状态的使用:更新操作,也可以执行插入操作

                   语法:db.collectionName.update({query},{"$set":{<key1>:<value1>,<key2>:<value2>,...<keyn>:<valuen>}},insertBoolean)

                         如果查询条件没有找到相应的文档,该表达式就会执行插入操作


                   语法:db.collectionName.update({query},insertBoolean,multiBoolean)

                         如果存在多条记录,则会修改所有的文档


                   参数说明:

                        query:查询条件,确定需要修改的文档

                        $set:修改器,用于赋值修改

                        key1-n:要操作的字段名

                        value1-n:需要给key字段赋的值,key和value一一对应。

                        insertBoolean:当记录不存在的时候是否增加记录,true表示增加,false表示不增加

                        multiBoolean:是否需要修改多条记录,true表示可以修改多条记录,false表示修改第一条记录
                        

                   示例代码:

                         原始数据是空的,
                         > db.students.find()
                         >


                         按通过修改增加数据
                         > db.students.update({20,1)">0}},true)
                         WriteResult({
                                 5ac7187f7da6f59ef2f3836a)
                         })
                         >


                         数据插入成功
                         > db.students.find()
                         {  }
                         >


                         如果数据库中存在多条名称重复的记录,为每条记录增加字段

                         原始记录,里面有两个叫bob的文档
                         > }
                         { 5ac7197f7a05450cf60c688823,1)">5ac7198b7a05450cf60c6889 }


                          修改了两条,执行成功
                          > db.students.update({jiangxi"}},1)">false,1)">)
                          WriteResult({ 2,1)"> })



                          查看结果,已经为两个叫bob的记录增加了一个叫school的字段。

                          > db.students.find()
                          {  }
                          { " }



三、总结

           今天就写到这里了,有关更新的内容还很多,今天只是介绍一个大概的内容,让大家对MongoDB的操作有一个初步的印象。随着我们学习的深入,还会有更多的内容更新上来,不忘初衷,继续努力吧。
                                                                                     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读752次。关系型数据库关系型数据库是一个结构化的数据库,创建在关系模型(二维表模型)基础上,一般面向于记录SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言,用于执行对关系型数据库中数据的检索和操作主流的关系数据库包括Oracle、Mysql、SQL Server、Microsoft Access、DB2等非关系型数据库NoSQL(nOSQL=Not Only SQL),意思是“不仅仅是SQL”,是非关系型数据库的总称。除了主流的关系型数据库外的数据库,都认为是非关系型主流的NoSQ.._redis是非关系型数据库吗
文章浏览阅读687次,点赞2次,收藏5次。商城系统中,抢购和秒杀是很常见的营销场景,在一定时间内有大量的用户访问商场下单,主要需要解决的问题有两个:1. 高并发对数据库产生的压力;2. 竞争状态下如何解决商品库存超卖;高并发对数据库产生的压力对于第一个问题,使用缓存来处理,避免直接操作数据库,例如使用 Redis。竞争状态下如何解决商品库存超卖对于第二个问题,需要重点说明。常规写法:查询出对应商品的库存,判断库存数量否大于 0,然后执行生成订单等操作,但是在判断库存是否大于 0 处,如果在高并发下就会有问题,导致库存_php库存结余并发
文章浏览阅读1.4k次。MongoTemplate开发spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB,MongoRepository的方式访问较为简单,MongoTemplate方式较为灵活,这两种方式在Java对于MongoDB的运用中相辅相成。_springboot插入指定的mongodb数据库
文章浏览阅读887次,点赞10次,收藏19次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的特点是可以存储非结构化的数据,并且可以处理大量的数据。HBase是一个分布式、可扩展的列式存储系统,它是基于Google的Bigtable设计的。HBase是一个开源的NoSQL数据库,它的核心功能是提供高性能的随机读写访问。在本文中,我们将对比HBase与其他NoSQL数据库,例如Redis、MongoDB、Cass...
文章浏览阅读819次。MongoDB连接失败记录_edentialmechanisn-scram-sha-1
文章浏览阅读470次。mongodb抽取数据到ES,使用ELK内部插件无法获取数据,只能试试monstache抽取mongodb数据,但是monstache需要mongodb replica set 模式才能采集数据。############monstache-compose文件。#replicas set 启动服务。# 默认备份节点不能读写,可以设置。# mydb指的是需要同步的数据库。#登录主mongodb初始化rs。#primary 创建用户。# ip地址注意要修改。# ip地址注意要修改。_monstache csdn
文章浏览阅读913次,点赞4次,收藏5次。storage:fork: trueadmin登录切换数据库注意: use 代表创建并使用,当库中没有数据时默认不显示这个库删除数据库查看表清单> show tables # 或者 > show collections表创建db.createCollection('集合名称', [options])table1字段类型描述capped布尔(可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。_mongodb5
文章浏览阅读862次。Centos7.9设置MongoDB开机自启(超全教程,一条龙)_mongodb centos开机启动脚本
文章浏览阅读1.3k次,点赞6次,收藏21次。NoSQL数据库使用场景以及架构介绍
文章浏览阅读856次,点赞21次,收藏20次。1.背景介绍1. 背景介绍NoSQL数据库是一种非关系型数据库,它的设计目标是为了解决传统关系型数据库(如MySQL、Oracle等)在处理大量不结构化数据方面的不足。NoSQL数据库可以处理大量数据,具有高性能、高可扩展性和高可用性。但是,与关系型数据库不同,NoSQL数据库没有固定的模式,数据结构也不一定是表格。在NoSQL数据库中,数据存储和查询都是基于键值对、列族、图形等不同的...
文章浏览阅读416次。NoSQL定义:非关系型、分布式、开放源码和具有横向扩展能力的下一代数据库。由c++编写的开源、高性能、无模式的基于分布式文件存储的文档型数据库特点:高性能、高可用性、高扩展性、丰富的查询支持、可替换已完场文档某个指定的数据字段应用场景:社交场景:使用mongodb存储用户信息游戏场景:用户信息,装备积分物流场景:订单信息,订单状态场景操作特点:数据量大;读写操作频繁;价值较低的数据,对事物性要求不高开源、c语言编写、默认端口号6379、key-value形式存在,存储非结构化数据。_nosql
文章浏览阅读1.5k次,点赞3次,收藏2次。Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket. at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:110) at redis.clients.jedis.Connection.connect(Conne_redis.clients.jedis.exceptions.jedisconnectionexception: failed to create so
文章浏览阅读6.5k次,点赞3次,收藏12次。readAnyDatabase(在所有数据库上都有读取数据的权限)、readWriteAnyDatabase(在所有数据库上都有读写数据的权限)、userAdminAnyDatabase(在所有数据库上都有管理user的权限)、dbAdminAnyDatabase(管理所有数据库的权限);:clusterAdmin(管理机器的最高权限)、clusterManager(管理和监控集群的权限)、clusterMonitor(监控集群的权限)、hostManager( 管理Server);_mongodb创建用户密码并授权
文章浏览阅读593次。Redis是一个基于内存的键值型NoSQL数据库,在实际生产中有着非常广泛的用处_搭建本地redis
文章浏览阅读919次。Key 的最佳实践[业务名]:[数据名]:[id]足够简短:不超过 44 字节不包含特殊字符Value 的最佳实践:合理的拆分数据,拒绝 BigKey选择合适数据结构Hash 结构的 entry 数量不要超过 1000(默认是 500,如果达到上限则底层会使用哈希表而不是 ZipList,内存占用较多)设置合理的超时时间批量处理的方案:原生的 M 操作Pipeline 批处理注意事项:批处理时不建议一次携带太多命令。Pipeline 的多个命令之间不具备原子性。_redis高级实战
文章浏览阅读1.2k次。MongoDB 递归查询_mongodb数据库 递归
文章浏览阅读1.2k次。通过实际代码例子介绍:如何通过MongoTemplate和MongoRepository操作数据库数据_springboot操作mongodb
文章浏览阅读687次,点赞7次,收藏2次。首先欢迎大家阅读此文档,本文档主要分为三个模块分别是:Redis的介绍及安装、RedisDesktopManager可视化工具的安装、主从(哨兵)模式的配置。_redis 主从配置工具
文章浏览阅读764次。天下武功,无坚不摧,唯快不破!我的名字叫 Redis,全称是 Remote Dictionary Server。有人说,组 CP,除了要了解她外,还要给机会让她了解你。那么,作为开发工程师的你,是否愿意认真阅读此心法抓住机会来了解我,运用到你的系统中提升性能。我遵守 BSD 协议,由意大利人 Salvatore Sanfilippo 使用 C 语言编写的一个基于内存实现的键值型非关系(NoSQL)..._redis 7.2 源码
文章浏览阅读2k次。MongoDB 的增删改查【1】_mongodb $inc