最近在看《MongoDB权威指南》,写博客记录一下相关内容~~

关于安装之类的最基本的就不多说了,从基本操作增删改查开始。

MongoDB官网地址:http://www.mongodb.org/

我使用的是MongoDB 2.4.8

插入文档

db.user.insert({"name":"jun"})

在user中插入一条记录。这个操作会给文档添加一个"_id"键。如下图所示:

如果要插入多个文档,使用批量插入会快一些,一次批量插入只是单个TCP请求,无需处理大量的消息头,减少了插入时间。

db.user.insert([{"name":"jun"},{"name":"jun12"}])

这个可能是在新版本才支持的,在网上的博客中都说shell不支持。

MongoDB消息的长度最大是16M,所以使用批量插入时还是有限制的。

MongoDb插入原理:使用驱动程序进行插入的时候,会将数据转换成BSON格式。数据库会解析BSON,并检验是否含有“_id”键。而且每次插入文档不能超过4M。

删除文档

db.user.remove()

上面的命令会删除user集合中的文档,但不会删除user集合本身,索引也会保留。

remove函数可以接受一个查询作为可选参数。给定参数之后,只有符合条件的文档才会被删除。

db.user.remove({"name":"jun"})

上面的命令会删除user集合中name为jun的文档。如下图所示:

删除数据是永久的,不能撤销也不能恢复。

更新文档

1.文档替换

db.user.update({"_id":ObjectId("52d791307ae252f9149547c9")},jun)

将_id为ObjectId("52d791307ae252f9149547c9")的文档更新为jun,jun是一个object。

详细如下图

先将查找的数据复制给jun变量,修改name属性,在使用命令db.user.update({"_id":ObjectId("52d791307ae252f9149547c9")},jun)在数据库中更新。当update时,数据库会去查找一个_id为ObjectId("52d791307ae252f9149547c9")的文档,并替换它。update时最好使用_id。

2.使用修改器

当文档只需要修改一部分时,利用原子的更新修改器,效率更高。

1."$set"修改器

"$set"是用来设置一个键的值的,如果这个键不存在,就创建它。

db.user.update({"name":"jun12"},{"$set":{"email":"jun@126.com"}})

使用$set修改器向name为jun12的文档里添加或修改键email为jun@126.com

详细如下图

如果使用如下命令

db.user.update({"name":"jun12"},{"email":"jun@126.com"})

会将name为jun12的文档替换为文档{"email":"jun@126.com"},就相当于前面的文档替换。

如果要删除一个key就使用对应的$unset

db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $unset: {"email" : 1}});

执行完这条命令后,_id是ObjectId('54deeacc2736e74e058b4568')的文档里就会移除email的key。

2."$inc"修改器

"$inc"修改器可以用来增加已有键的值,或者在建不存在时创建一个键。

db.user.update({"name":"jun12"},{"$inc":{"score":100}})

上面的命令会在name为jun12的文档的score键上加100,如果score键不存在,就创建score键,并把值设置为增加量100。

详细如下图

"$inc"只能用于整数、长整数或双精度浮点数,不仅仅其后的值,而且要更新的键值也要满足。如果用在其他类型的数据上就会导致操作失败。其中包括很多语言会自动转换成数字的类型,例如null、布尔类型或数字构成的字符串。"$inc"专门用来增加或减少(数字为负数)数字的。

3."$push"修改器

"$push"修改器可以向数组的末尾加入一个元素,如果指定的键不存在,就会创建一个新数组,并把要插入的元素插入。

 db.user.update({name:"jun12"},{$push:{tel:12345678902}})

上面的命令会在name为jun12的文档的tel键上插入一个元素12345678902,如果tel键不存在,就创建tel键,并出插入元素。

详细如下图

如果要添加多条,可以使用$pushAll,代码如下

db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $pushAll: {tel : [15155555555,13133334343]}});

4."$addToSet"修改器

"$addToSet"也可用来插入数组元素,与"$push"不同的是,当要插入的元素在数组中已经存在时,"$addToSet"就不会再次插入。可以用来避免重复。

db.user.update({_id:ObjectId("52d791327ae252f9149547cb")},{$addToSet:{tel:12345678903}})

详细如下图

第一次插入因为存在相同元素没有插入,第二次插入tel中。

5."$each"修改器

"$each"用来循环,与"$addToSet"结合使用,可以不重复的插入多个元素。

db.user.update(
  {_id:ObjectId("52d791327ae252f9149547cb")},
  {$addToSet:{tel:{$each:[12345678903,12345678904,12345678905]}}}
)

详细如下图

6."$pop"修改器

"$pop"作用与"$push"相反,可以从数组中删除元素,{$pop:{key:1}}从数组末尾删除一个元素,{$pop:{key:-1}}则从头部删除。

db.user.update(
  {_id:ObjectId("52d791327ae252f9149547cb")},
  {$pop:{tel:1}}
)

详细如下图

7."$pull"修改器

"$pull"修改器会将所有符合条件的元素都删掉。

db.user.update({},{$pull:{tel:12345678901}})

详细如下图

如果有多条,可以使用$pullAll,代码如下

db.user.update({'_id': ObjectId('54deeacc2736e74e058b4568')},{ $pullAll: {tel : [12345678902,12345678903]}});

8."$"修改器

若数组有多个值,我们只想对其中一部分进行操作,就需要用位置或者定位操作符"$"。

db.blog.update(
  {"comments.author":"jun"},
  {"$set":{"comments.$.author":"harry"}}
)

定位符职匹配第一个,会将jun的第一个评论的名字修改为harry。

upsert操作

upsert是一种特殊的更新。要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。

其命令就是将update的第3个参数设为true。

db.blog.update(
  {"url":"/blog"},
  {"inc":{"visit":1}},
  true)

upsert是原子性的,比起查询出来,判断是否存在,再决定添加还是修改要高效的多。

更新多个文档

默认情况下更新只针对第一个匹配的文档执行,若要使所有匹配的文档都更新,只需设置update的第4个参数为true。

db.blog.update(
  {"visit":1},
  {"inc":{"visit":1}},
  false, true)

findAndModify

拥有类似事务特性的更新与查询操作。它是原子性的,会返回符合查询条件的更新后的文档。

一次只能处理一个文档,也就是条件query条件,且执行sort后的第一个文档。

比更新要慢,大概耗时相当于一次查找、一次更新和一次getLastError顺序执行所需的时间。

db.COLLECTION_NAME.findAndModify({query:{}, update:{}, remove:true|false, new:true|false, sort:{}, fields:{}, upsert:true|false});

query是查询选择器,与findOne的查询选择器相同

update是要更新的值,不能与remove同时出现

remove表示删除符合query条件的文档,不能与update同时出现

new为true:返回更新后的文档,false:返回更新前的,默认是false

sort:排序条件,与sort函数的参数一致。

fields:投影操作,与find*的第二个参数一致。

upsert:与update的upsert参数一样。

使用findAndModify能够实现的功能如下:

1. 查找并更新

2. 查找并删除

3. 查找,存在就更新,不存在就插入一条

今天就先到这里~~该去吃饭了~~

MongoDB的学习--文档的插入、删除和更新的更多相关文章

  1. jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒子(重要),jq操作滚动条

    jQuery---jq操作标签文本(html(),text()),jq操作文档标签(插入,删除,修改),克隆,,jq操作属性,jq操作class属性,jq操作表单value,jq操作css,jq操作盒 ...

  2. MongoDB的学习--文档的查询

    继续关于<MongoDB权威指南>记录,今天的内容是文档的查询~~ MongoDB官网地址:http://www.mongodb.org/ 我使用的是MongoDB 2.4.8 find函 ...

  3. MongoDB中的映射,限制记录和记录拼排序 文档的插入查询更新删除操作

    映射 在 MongoDB 中,映射(Projection)指的是只选择文档中的必要数据,而非全部数据.如果文档有 5 个字段,而你只需要显示 3 个,则只需选择 3 个字段即可. find() 方法 ...

  4. 【MongoDB学习之二】MongoDB数据库、文档、集合、元数据

    环境 MongoDB 4.0 CentOS6.5_x64 一.连接语法格式: mongodb://[username:password@]host1[:port1][,host2[:port2],.. ...

  5. SpringMVC MongoDB之“基本文档查询(Query、BasicQuery)”

    一.简介 spring Data  MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一篇我 ...

  6. MongoDB 集合与文档操作

    一.创建DB 1.查看DB >show dbs 2.创建DB >use mydb 3.查看当前DB >db 4.删除DB >use mydb >db.dropDataba ...

  7. 2013 最新的 play web framework 版本 1.2.3 框架学习文档整理

    Play framework框架学习文档 Play framework框架学习文档 1 一.什么是Playframework 3 二.playframework框架的优点 4 三.Play Frame ...

  8. Openstack python api 学习文档 api创建虚拟机

    Openstack python api 学习文档 转载请注明http://www.cnblogs.com/juandx/p/4953191.html 因为需要学习使用api接口调用openstack ...

  9. C# Word文档中插入、提取图片,文字替换图片

    Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...

随机推荐

  1. bzoj 3517: 翻硬币

    3517: 翻硬币 Time Limit: 1 Sec  Memory Limit: 128 MB Description 有一个n行n列的棋盘,每个格子上都有一个硬币,且n为偶数.每个硬币要么是正面 ...

  2. (转)数据库获得当前时间getdate()

    CONVERT(nvarchar(10),count_time,121): CONVERT为日期转换函数,一般就是在时间类型 (datetime,smalldatetime)与字符串类型(nchar, ...

  3. aehyok.com的成长之路一——开篇

    前言   不得不说最近三个月都没更新博客了,除了6月初的一篇博客外,今天的这一篇算是这三个月里发表的第二篇博客了.不过本人几乎每天都在博客园里刷来刷去,看大家发表的博文,从中汲取营养.确实博客园也可以 ...

  4. DotNetMQ的一个小demo

    DotNetMQ是一个新的.独立的.开源的,完全基于C#和.NET Framework3.5的消息队列系统 下载源代码 - 1.28 MB 下载二进制文件 - 933 KB 下载例子 - 534 KB ...

  5. 编译Ngnix遇到的问题,查看程序依赖的库文件

    要点:ldd 可以读取每个可以运行的程序依赖的 so 文件. 编译的时候提示需要Openssl库. 查看本机,已经安装了openssl 查看编译报错文件,查找Openssl所依赖的库 more obj ...

  6. Unity3D Shader入门指南(一)

    动机 自己使用Unity3D也有一段时间了,但是很多时候是流于表面,更多地是把这个引擎简单地用作脚本控制,而对更深入一些的层次几乎没有了解.虽然说Unity引擎设计的初衷就是创建简单的不需要开发者操心 ...

  7. APK重签名总结

    keytool -genkey -alias aeo_android.keystore -keyalg RSA -validity 20000 -keystore aeo_android.keysto ...

  8. Oracle 12c

    Common User vs. Local User – 12c Edition http://dbasolved.com/2013/06/29/common-user-vs-local-user-1 ...

  9. 学习之路三十六:SQL知识总结 - [游标||字符串分割]

    好久没有写文章了,今天把前不久项目用到的SQL知识总结一下. 一丶字符串分割 SQL内置函数中是没有Split分割函数的,所以需要自己去实现,不多说,上代码: )) RETURNS @result T ...

  10. thinking in object pool

    1.背景 对象池为了避免频繁创建耗时或耗资源的大对象,事先在对象池中创建好一定数量的大对象,然后尽量复用对象池中的对象,用户用完大对象之后放回对象池. 2.问题 目前纵观主流语言的实现方式无外乎3个步 ...