初识MongoDB(四)
1. 批量插入:以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销。就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封装消息头数据。对于数据导入而言,我们可以使用mongoimport完成。2. 数据库清除:> db.users.remove() 以上命令将会清除users集合中的所有数据,但是不会删除集合本身以及关联的索引。数据删除操作是不可恢复的,一旦删除就物理的删除了。对于全集合清除这种case,一个更为有效的方式是直接删除集合对象本身以及他关联的所有索引,之后再依次重建,如:> db.one_collection.drop()3. 数据更新: 如果在执行数据更新时,有多条文档匹配更新条件,为了避免更新后的_id出现重复性冲突,MongoDB将仅更新第一条查询结果,如:> post1 = { "name": "stephen", "age" : "35"}{ "name" : "stephen", "age" : "35" }> post2 = { "name": "stephen", "age" : 36}{ "name" : "stephen", "age" : 36 }> db.blog.insert(post1)> db.blog.insert(post2)> post3 = { "name" : "stephen", "age": 37}{ "name" : "stephen", "age" : 37 }> db.blog.update({"name":"stephen"},post3)> db.blog.find(){ "_id" : ObjectId("4fcd7e2e20668578cc1097d8"), "name" : "stephen", "age" : 36 }{ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 37 }4. 修改器:使用修改器进行数据更新是原子的,也是高效的,不同于全部文档更新的是被更新文档的_id不会变化,而文档完全更新则会修改文档的_id,以及相关的索引。> db.blog.find(){ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 41 }{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }--$inc修改符将匹配条件的文档的age键原子加一,缺省情况下只是更新第一条符合条件的文档。> db.blog.update({"name":"stephen"},{"$inc":{"age":1}}) > db.blog.find(){ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 42 }{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 38 }--可以通过update函数的最后一个参数来指定更新所有符合条件的文档,如:> db.blog.update({"name":"stephen"},{"$inc":{"age":1}},true,true)> db.blog.find(){ "_id" : ObjectId("4fcd7e2820668578cc1097d7"), "name" : "stephen", "age" : 43 }{ "_id" : ObjectId("4fcd81bb20668578cc1097d9"), "name" : "stephen", "age" : 39 } --$set修改符直接修改匹配文档的内容,如果修改的键存在则直接修改,否则新增。> db.blog.update({"name":"stephen"},{"$set":{"genda":"male"}})> db.blog.find(){ "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "genda" : "male", "name" : "stephen" }--$unset修改符合$set的功能是完全相反的,如:> db.blog.update({"name":"stephen"},{"$unset":{"genda":"male"}})> db.blog.find(){ "_id" : ObjectId("4fcd88b720668578cc1097da"), "age" : "35", "name" : "stephen" }--可以通过$set修改符修改嵌套子文档。> db.blog.find(){ "_id" : ObjectId("4fcd8e0220668578cc1097db"), "title" : "A Blog Post", "author" : { "name" : "joe", "email" : "joe@ee.com" } }> db.blog.update({"title":"A Blog Post"},{"$set":{"author.name":"joe schmoe"}})> db.blog.find(){ "_id" : ObjectId("4fcd8e0220668578cc1097db"), "author" : { "email" : "joe@ee.com", "name" : "joe schmoe" }, "title" : "A Blog Post" }5. 数组修改器:> db.blog.insert({"title":"one blog"})> db.blog.find(){ "_id" : ObjectId("4fcd909520668578cc1097dc"), "title" : "one blog" }--如果其操作的键不存在,则创建新的键值,其值的类型为数组类型。> log.update({"title":"one blog"}, {"$push": {"comments":{"content":"hello"}}})> db.blog.findOne(){"_id" : ObjectId("4fcd909520668578cc1097dc"),"comments" : [{"content" : "hello"}],"title" : "one blog"}--如果$push操作的键值已经存在,且其值为数组类型,该修改符将为该数组添加新的数组元素。> db.blog.update({"title":"one blog"}, {"$push": {"comments":{"content":"word"}}> db.blog.findOne(){"_id" : ObjectId("4fcd909520668578cc1097dc"),"comments" : [{"content" : "hello"},{"content" : "word"}],"title" : "one blog"}> post = {"username":"joe", "emails":["joe@example.com","joe@gmail.com","joe@yahoo.com"]}{"username" : "joe","emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com"]}> db.blog.insert(post)> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"username" : "joe","emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com"]}--$addToSet适用于数组,如果数组中该元素已经存在,该命令就不做任何操作后返回,否则将新元素插入数组。> db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@gmail.com"}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"username" : "joe","emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com"]}> db.blog.update({"username":"joe"}, {"$addToSet": {"emails":"joe@hotmail.com"}> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com","joe@hotmail.com"],"username" : "joe"}--$addToSet和$each的组合可以将数组插入到另外一个数组中。> db.blog.update({"username":"joe"},{"$addToSet": {"emails":{"$each":["joe@php.net","joe@example.com"]}}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com","joe@hotmail.com","joe@php.net"],"username" : "joe"}--$pop从数组中删除一个元素,如参数为1,表示从数组的尾部删除一个元素,如果是-1,则从头部删除。> db.blog.update({"username":"joe"}, {"$pop":{"emails":1}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@example.com","joe@gmail.com","joe@yahoo.com","joe@hotmail.com"],"username" : "joe"}> db.blog.update({"username":"joe"}, {"$pop":{"emails":-1}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@gmail.com","joe@yahoo.com","joe@hotmail.com"],"username" : "joe"} --$pull修改符则是从数据中删除指定的元素> db.blog.update({"username":"joe"}, {"$pull":{"emails":"joe@yahoo.com"}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@gmail.com","joe@hotmail.com"],"username" : "joe"}--使数组中出现重复的元素,便于后面修改符的功能演示。> db.blog.update({"username":"joe"}, {"$push": {"emails":"joe@gmail.com"}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@gmail.com","joe@hotmail.com","joe@gmail.com"],"username" : "joe"}--在数组中,第一个元素的下标是0,然后依次增长。下面的示例是将数组中下标为1--(第二个元素)的元素值修改为新值。> db.blog.update({"username":"joe"}, {"$set":{"emails.1":"joe@example.com"}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@gmail.com","joe@example.com","joe@gmail.com"],"username" : "joe"}--有的时候,特别是在修改查询结果的时候,我们无法获知结果文档数组下标,MongoDB--提供了$定位符表示查询结果的下标。但是该他只更新第一个匹配元素。> db.blog.update({"emails":"joe@gmail.com"},{"$set":{"emails.$":"joe@hotmail.com"}})> db.blog.findOne(){"_id" : ObjectId("4fd2e468b2ac404941134bed"),"emails" : ["joe@hotmail.com","joe@example.com","joe@gmail.com"],"username" : "joe"}6. upsert:upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。> db.blog.remove()> db.blog.update({"username":"joe"},{"username":"joe","age":30},true) > db.blog.findOne(){"_id" : ObjectId("4fd2faac576cd9c101ac0f3d"),"username" : "joe","age" : 30}下面的示例可以在新增的同时,修改新增后的值。 > db.blog.remove()> db.blog.update({"count":25},{"$inc":{"count":3}},true)> db.blog.find(){ "_id" : ObjectId("4fd2fd59576cd9c101ac0f3e"), "count" : 28 }save是一个shell函数,可以在文档不存在时插入,存在时更新。upsert也可以完成同样的工作,但是不如save命令方便。> var x = db.blog.findOne()> x.count = 4040> db.blog.save(x)> db.blog.findOne(){ "_id" : ObjectId("4fd2fde4576cd9c101ac0f3f"), "count" : 40 }7. 返回已更新文档:可以通过getLastError命令获取更新多个文档时被更新的文档数量。> db.blog.remove()> db.blog.insert({"name":"stephen"})> db.blog.insert({"name":"stephen3"})> db.blog.insert({"name":"stephen4"})> db.blog.update({},{"$set":{"name":"liu"}},false,true)--n:3表示修改的数量为3。> db.runCommand({getLastError:1}){"updatedExisting" : true,"n" : 3,"connectionId" : 1,"err" : null,"ok" : 1}findAndModify可以原子性的修改查询结果,也可以原子性的删除查询结果。> db.blog.insert({"name":"stephen"})> db.blog.insert({"name":"stephen2"})> db.blog.find(){ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }{ "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen2" } > db.runCommand({"findAndModify":"blog", "query":{"name":"stephen2"},"update":{"$set":{"name":"stephen3"}}})> db.blog.find(){ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }{ "_id" : ObjectId("4fd30cd417f6dccb7c058245"), "name" : "stephen3" } > runCommand({"findAndModify":"blog", "query":{"name":"stephen3"},"remove":true})> db.blog.find(){ "_id" : ObjectId("4fd30cd117f6dccb7c058244"), "name" : "stephen" }findAndModify命令中每个键对应的值如下:findAndModify: 字符串类型的集合名称。query:查询文档,用来检索文档的条件。sort: 排序结果的条件。update:修改文档,对所找到的文档执行的更新。remove:布尔类型,表示是否删除文档。new:布尔类型,表示返回的是更新前的文档还是更新后的文档。缺省是更新前文档。update和remove必须有一个存在,也只能有一个存在。如果没有匹配的文档,该命令会返回一个错误。这个命令有些限制,即一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。
上述来源于:http://www.cnblogs.com/stephen-liu74/archive/2012/08/06/2553737.html
转载于:https://www.cnblogs.com/bjrwx/p/9258838.html
初识MongoDB(四)相关推荐
- mongodb 搜索速度_初识 MongoDB 数据库
初识 MongoDB 数据库 前言 Flask 基础框架在之前的三篇文章中写完了.想要学习 web 相关的同学可以自己回顾翻一下,相信看完了,你也可以写出来一个简单的小案例来炫耀一波! 说到 web ...
- 初识react(四) react中异步解决方案之 redux-saga
回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 ...
- 头歌 初识MongoDB
初识MongoDB 第1关:启动 MongoDB 第2关:启动 MongoDB 多实例 第3关:退出客户端和关闭 MongoDB 服务 第1关:启动 MongoDB cd /data mkdir my ...
- MongoBD 系列(1) —— 初识 MongoDB
初识 MongoDB 文章目录 初识 MongoDB 什么是MongoDB? MongoDB 的安装 1. 传统二进制安装 2. Docker 安装 MongoDB 的使用 1. MongoDB 结构 ...
- 初识MIMO(四):MIMO的接收端检测技术及其仿真
初识MIMO(四):MIMO的接收端检测技术及其仿真 零 代码地址 https://github.com/liu-zongxi/MIMO_simulation 请大家看完觉得有用别忘了点赞收藏,git ...
- Mongodb系列:初识Mongodb
一.背景: 月初进行了期末考试很荣幸能够参加到了考试系统维护中(详情请阅读:<那些年我们一起参加的活动:15年上半年考试系统维护总结>)!主要负责服务器维护,在维护期间对Mongodb相逢 ...
- 初识Nginx四:nginx代理服务器配置缓存
文章目录 一.背景 二.配置 三.测试 四.注意点 一.背景 在上篇文章<初识Nginx二:配置一个反向代理服务器>中,我们成功通过Nginx的反向代理功能访问了上游的应用服务器. 在实际 ...
- 初识Mongodb总结
MongoDb 概述 MondoDb是什么 MongoDB是一个面向文档的数据库系统.使用C++编写,不支持SQL,但有自己功能强大的查询语法.MongoDB使用BSON作为数据存储和传输的格式. ...
- mongodb单表最大记录数_SpringBoot+Cloud全家桶微服务实战项目之文档型数据库MongoDB四...
一.MongoDB简介以及使用场景 MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富, ...
最新文章
- Corner Proposal Network 论文阅读(2020ECCV)
- 两种方式(goto语句以及while循环)实现C语言关机小程序
- 关于MySQL索引知识与小妙招 — 学到了!
- innodb_buffer_pool_size的安全上限
- Xamarin Essentials教程振动Vibration
- MariaDB10 主从配置
- linux内核spi总线驱动分析,Linux下的SPI总线驱动(三)
- java字符串字符排列组合_如何在Java中查找字符串的所有排列
- lingo入门教程之一 --- 初识lingo
- vtd xml java_新兴XML处理方法VTD-XML介绍
- 良心好用无功能限制、珍藏单文件版Windows录屏软件分享!
- 介绍一款国际性的本体社群聊天软件Discord
- JsBarcode条形码组件封装
- 设计模式在项目中的应用案例_案例|P6软件在水电项目施工管理中的应用
- 操作系统中的故障恢复控制台意义非凡
- tangent space /handness
- 【华为OD统一考试B卷 | 200分】服务器广播、需要广播的服务器数量( C++ Java JavaScript )
- 城市如何缓解交通拥堵
- 数据可视化: matplotlib绘制动态图及3维动画
- 【聆思CSK6 视觉AI开发套件试用】人脸识别和 tflite-micro 语音识别推理实验
热门文章
- JavaMail中附件名称有乱码
- ramdisk根文件系统+initramfs
- solr 3.5 配置及应用(二)
- MAC 安装 Magento2 community edition 详细步骤
- nacos启动_nacos微服务注册中心
- oracle 取mac地址,java执行命令,得到Mac地址
- e5cc温控仪通讯参数设定_自动化工程师:施耐德 PLC常见两种编程通讯控制实例,收好不谢...
- php ip2long mysql,PHP基于ip2long实现IP转换整形
- java x锁_基于Java名称的锁?
- 返回数据_多层数据返回匹配值