MongoDB增删改查操作详解
一、插入
MongoDB的插入操作很简单,使用insert方法,这里演示从创建数据库、创建集合到插入文档、查询文档。
集合创建方法参数说明:
size:集合最大空间
max:集合最多文档数量
(超出size和max限制都会删除最早的记录)
二、删除
MongoDB删除操作也很简单,使用remove方法,这里演示删除刚刚插入的文档。
remove函数如果没有传参数,直接调用则是删除集合中所有文档。
三、更新
为了方便下面的演示,我事先在刚刚创建的‘blog’集合中插入了4个文档:
1. 替换整个文档(这里演示替换第一个文档):
(这种情况下_id不变,若是要更新_id请注意防止键冲突)
2. 使用修改器更新文档指定部分:
(1)$inc:数字增加/减少
(若对应键不存在则会先创建键,若键对应值不是数字则会报错)
(2)$set:设置键值
(可以操作多种数据类型,可以改变键值的数据类型,还可以用于修改内嵌文档,若对应键不存在则会先创建键)
(3)$unset:删除某个键
(4)$push:若对应键已存在则会向已有数组末尾加入一个元素,否则会创建一个新的数组。
(5)$addToSet:如果一个值不在数组里面就把它加进去,使用方法和$push一样,只是不能添加重复的元素。
将$addToSet和$each组合起来,可以一次向数组中添加多个不同的值。
(6)$pop:从数组任何一端删除一个元素。
(貌似负数都是从头部删除,0和正数都从末尾删除)
(7)$pull:删除数组中所有符合条件的元素。
(8)使用数组下标选择需要修改的数组元素:
(9)使用定位符选择需要修改的数组元素:
修改器速度:
$inc不需要改变文档大小,所以速度非常快。
数组修改器可能更改了文档大小,速度比较慢。
$set在文档大小不发生变化时速度比较快,否则性能也会有所下降。
MongoDB预留了些补白给文档来适应大小变化,但要是超出了原来的空间,还是要分配一块新的空间。
要是$push成为瓶颈,可以将内嵌数组独立出来,放到单独一个集合里面。
3. upsert:
如果存在符合条件的文档则更新,否则以匹配条件和更新文档为基础插入文档。
将update()函数的第三个参数设置为true即可。
4. save:shell函数,文档不存在时插入,存在时更新。
函数参数为一个文档,若文档存在‘_id’键则调用upsert,否则调用insert。
5. 更新多个文档:
默认情况下,更新只能对符合匹配条件的第一个文档执行操作,要使所有匹配到的文档都得到更新,
可以设置update()函数的第4个参数为true。(这个行为今后可能会被更改)
若想知道到底更新了多少文档,可以运行命令:
db.runCommand({getLastError:1})
打印出来的结果中“n”对应的数值就是被更新的文档的数量。
6. findAndModify:先返回结果然后更新。
findAndModify命令中每个键对应的值:
findAndModify:字符串,集合名称。
query:查询文档,用来检索文档的条件。
sort:排序方式,1表示升序,-1表示降序。
update:修改器文档,对找到的文档执行的更新操作。
remove:布尔类型,表示是否删除文档,默认不删除。
new:布尔类型,表示返回更新前的文档还是更新后的文档,默认返回更新前的文档。
Update键和remove键必须有且仅有一个,如果匹配不到文档这个命令会报错。
一次只能处理一个文档,也不能执行upsert操作,只能更新已有文档。
相对普通更新来说,findAndModify速度要慢一些,大概耗时相当于一次查找、一次更新和一次getLastError顺序执行所需的时间。
四、查询
1.一般条件查询:
(_id键总是会被返回,除非显式将其剔除)
查询条件表示符:
$lt(<)、$lte(<=)、$gt(>)、$gte(>=)、$ne(<>)
2. OR查询:
OR查询有两种方式:$in、$or,$in只能对单个键做or查询,如需要对多个键做or查询应该使用$or。$in对应的还有$nin。
3. $mod:将查询的值除以第一个给定值,若余数等于第二个给定值则返回该文档。
4. $not:元条件句,可以用在任何其他条件之上。
5. null值查询:
6. 正则表达式查询:
7. 数组查询:
(1)$all:通过多个元素来匹配数组(元素顺序无关)
(2)$size:根据数组长度查询。
(3)$slice:返回数组元素的一个子集合.
使用$slice将返回文档中所有的键,除非在第二个参数中显式剔除。
(4)查询内嵌文档:
查询整个内嵌文档与普通查询完全相同,但是查询文档的键值对顺序一定要和内嵌文档的键值对顺序一致,否则无法匹配,所以如果
内嵌文档增加或删除了键的话,相对应的查询也要进行更改,比较好的做法是只针对内嵌文档的特定键值进行查询(使用点表示法)。
(5)$elemMatch:将限定条件进行分组,仅当需要对一个内嵌文档的多个键操作时才会用到。
示图中两次查询的区别:
第一次查询,只要comments键对应数组中有两个元素分别满足查询文档中的两个查询条件或同一个元素同时满足这两个条件,
都会返回这个文档;第二次查询,则需要在数组同一个元素中同时满足这两个条件才会返回这个文档。
8. $where查询:可以执行任意JavaScript作为查询的一部分。
如果函数返回true,文档就作为结果的一部分被返回,否则不返回。
使用$where查询时,每个文档都要从BSON转换成JavaScript对象,然后通过$where的表达式来运行,而且还不能利用索引,
所以在速度上要比常规查询慢很多,只有在走投无路时才能考虑$where查询。
可以将常规查询作为前置过滤,与$where组合使用,这样不牺牲性能,也可以使用索引根据非$where子句进行过滤,$where
只用于对结果进行调优。
MongoDB增删改查操作详解的更多相关文章
- MongoDB增删改查操作详解(命令行)
一.插入 MongoDB的插入操作很简单,使用insert方法,这里演示从创建数据库.创建集合到插入文档.查询文档. 集合创建方法参数说明: size:集合最大空间 max:集合最多文档数量 (超出s ...
- mongodb增删改查操作
Note:mongodb存储的是文档,且文档是json格式的对象,所以增删改查都必须是json格式对象. 注:mongodb常用库和表操作,但mongodb在插入数据时,不需要先创建表. show d ...
- SSH登录与增删改查demo详解+源代码
点击下载,测试绝对可用SSH整合框架登录加增删改查demo 下载地址:http://download.csdn.net/detail/qq_33599520/9784679 一.框架概述 spri ...
- python3中列表、元组、字典的增删改查说明详解
python基础中的列表.元组.字典属于python中内置的序列数据结构.其中序列可以进行的操作包括索引.截取(切片).加.乘.成员检查等. 1.列表 列表(list)是最常用的python数据类型之 ...
- spring mongodb增删改查操作
添加数据 School @Id @GeneratedValue private long id; @Indexed(unique = true) private String name; studen ...
- 数据库——MongoDB增删改查
MongoDB增删改查操作 本文包含对数据库.集合以及文档的基本增删改查操作 数据库操作 #1.增 use config #如果数据库不存在,则创建并切换到该数据库,存在则直接切换到指定数据库. #2 ...
- SQLAlchemy02 /SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- Scala对MongoDB的增删改查操作
=========================================== 原文链接: Scala对MongoDB的增删改查操作 转载请注明出处! ==================== ...
随机推荐
- npm run build生成路径问题
vue项目中可以使用npm run build 命令生成静态文件夹dist,开发者可以直接点击dist文件夹下面的index.html问价来访问自己的项目,但是用vue-cli生成的项目,当运行npm ...
- Vuforia开发完全指南---不懂编程也能做AR程序
不懂编程也能做AR程序 可能一听到要做AR程序,很多人都会想到这是程序员的事.如果不懂编程,不会写代码,是做不了AR程序的.其实,Vuforia的Unity SDK非常人性化,即使你不会编程,也能做出 ...
- 可能是讲解ARM中断和中断嵌套最通俗易懂的文章
几天前一个学生问我ARM中断嵌套的问题,我才发现原来在我心中理所当然的事对学生来说理解实属不易. ARM有七种模式,我们这里只讨论SVC.IRQ和FIQ模式. 我们可以假设ARM核心有两根中断引脚 ...
- Spring在JSP页面使用ServletContext
在 JSP 页面使用Application 可以 看到使用的是WebApplicationContextUtils 而不是WebApplicationContext.ROOT_WEB_APPLICAT ...
- idea启动tomcat报错:Error during artifact deployment. See server log for details.
出现这种情况的原因老夫猜想是改变了artifact然而tomcat的配置中的artifact没有重新配就会出现这种报错 打开tomcat配置 删除原来的artifact 新添加artifact 保存 ...
- 翻译 | 玩转 React 表单 —— 受控组件详解
原文地址:React.js Forms: Controlled Components 原文作者:Loren Stewart 译者:小 B0Y 校对者:珂珂君 本文涵盖以下受控组件: 文本输入框 数字输 ...
- 【转】String字符串相加的问题
String字符串相加的问题 前几天同事跟我说我之前写的代码中在操作字符串时候,使用字符串相加的方式而不是使用StringBuffer或者StringBuilder导致内存开销很大.这个问题一直在困扰 ...
- Linux入门之常用命令(7)压缩
compress filename 压缩 -d解压缩 *.Z bzip -d解压缩 -z压缩 *.bz2 bzcat filename .bz2 读取压缩文件内容 gzip -d解压缩 -#压 ...
- CentOSv6.8 修改防火墙配置、修改SSH端口
查看防火墙目前使用状况: service iptables status 修改防火墙配置: vi /etc/sysconfig/iptables 重启防火墙,让刚才修改的配置生效: service i ...
- hdu4578 线段树 三次方,二次方,一次方的值
Yuanfang is puzzled with the question below: There are n integers, a 1, a 2, -, a n. The initial val ...