MongoDB学习笔记—03 增删改查操作
MongoDB的CURD操作分别通过函数insert()、update()、find()、remove()进行
MongoDB文档新增与删除
MongoDB中关于文档的新增与删除比较简单。主要通过insert方法数和remove方法进行。
文档新增
对目标集使用insert方法,可以插入一个文档,如:
db.user.insert({"name":"wangxs"})
若新增的文档没有"_id"键,则会自动添加。db.user.insert({"_id":"1,"name":"wangxs"})
批量插入:传递一个由文档构成的数组(数组由中括号表示[])给insert方法。如:
db.user.insert([{"name":"wangxs"},{"name":"wdh"},{"name":"cxx"}])
批量插入能够减少插入时间,因为一次插入就是一次TCP请求,而批量插入无需处理大量的消息头。
插入的原理
执行插入时,驱动程序会将数据转换成BSON的形式,然后将其送入数据库,数据库接下BSON,检验是否包含"_id"键并且文档不超过4MB,除此之外不做别的数据验证,只是简单的将文档原样存入数据库中。坏处是允许插入无效的数据,好处是可以远离注入式攻击(插入时并不执行代码),使数据库更安全。
可以在启动数据库服务器时使用--objcheck选项,这样服务器就会在插入之前检查文档的有效性(牺牲了速度)。
BSON
BSON:Binary JSON;是轻量的二进制格式,能够将MongoDB的所有文档表示成字节字符串,存在磁盘也是这种格式。同样,返回到客户端的文档也是BSON格式的字符串。驱动会进行解析并呈现。
BSON格式有下面3个主要的优点:更有效的表示数据,减少占用空间;牺牲空间效率,换取更容易的遍历格式;BSON的编码和解码的速度快,提高性能。
删除文档
使用remove方法对目标集进行数据的清除。如:
db.user.remove()
这种方式只会删除user集合的所有文档,而不删除集合本身,原有的索引也会被保留。
指定删除条件:remove函数接收一个文档作为条件参数,只有符合此条件的文档才会被删除,如:db.user.remove({{"age":22}});该命令删除user集合中年龄为22岁的文档。
数据的删除是永久性的,不能撤销也不能恢复。
删除速度:删除文档通常很快,但要清除整个集合,直接删除集合会更快
查找文档
文档查找涉及到一下几个方面:1)使用find或findOne函数和给定条件进行查询;2)使用$条件查询实现范围、集合包含、不等式和其他查询;3)$where子句或javascript进行复杂查询;4)对查询结果进行分页、排序等。
find函数
MongoDB使用find函数来进行查询,第一个参数决定了要返回哪些文档。若不指定查询文档,默认是{},表示匹配集合的全部内容。
例如:>db.user.find() // 将返回user集合的全部内容
向查询文档添加键值对时,意味着限定查找的条件。例如:
>db.user.find({"age":22}) // 查找user集合中年龄为22岁的用户
> db.user.find({"name":"wangdh"}) // 查找user集合中名字为wangdh的用户
向查询文档中添加多个键值对时,表示多条件组合查询(And操作),例如:
>db.user.find({"name":"wangdh","age":22}) //查找user集合中名字为wangdh且年龄为22岁的用户
指定返回的键(节省传输的数据量、解码文档的时间和内存占用)
有时并不需要将文档中的所有键值对都返回,可以通过find函数的第二个参数指定想要返回的键;例如:
>db.user.find({},{"name":1, "age":1}) // 返回_id、name、age三个键(默认返回_id键)。
>db.user.find({},{"_id":0}) // 返回除_id键外的所有键
查询条件
除了精确查询之外,还可以进行范围、OR、取反等复杂的查询。
1)数字和日期
数字和日期经常会有比较大小的操作,即<、<=、>、>=等操作,在MongoDB中,分别对应于:$lt、$lte、$gt、$gte等比较操作符。例如:
>db.user.find({"age":{"$gte":18,"$lte":30}}) //查询年龄在18-30(含)的用户
>start = new Date("01/01/2003")
>db.user.find({"birthday":{"$lt":start}}) // 查询在2003-01-01之前出生的用户
>db.user.find({"age":{"$ne":22}}) // 查询年龄不为22岁的用户、$ne操作符可用于任何数据类型
2)OR查询
MongoDB有两种方式来进行OR查询。$in操作符可以匹配一个键的多个值;$or操作符可以匹配多个键的任意给定值。相比之下$or操作符更通用。
>db.user.find({"age":{"$in":[22,25,30]}}) // 查询年龄为22、25、30的用户
> db.user.find({"age":{"$nin":[22,25,30]}}) // 查询年龄不为22、25、30的用户
>db.user.find({"$or":{"name":"wangdh"},{"age":22}}) // 查找姓名为wangdh或者年龄为22岁的用户
>db.user.find({"$or":{"name":"wangdh"},{"age":{""$in:[22,25,30]}}}) // 查找姓名为wangdh或者年龄为22、25、30岁的用户
3)$not、$mod操作符
$not是元条件句,可以用在其他条件之上,$mod是取模运算
>db.user.find({"num":{"$mod":[5,1]}}) // 返回num键的值除以5余1的文档
>db.user.find({"num":{"$or":{"$mod":[5,1]}}}) // 返回num键的值除以5不余1的文档
特定类型的查询
针对有特别表示的数据进行的查询,如:null
1)null
null不仅匹配自身,即值为null,也匹配不存在(缺少这个键);例如:
>db.user.find({"y":null})
>db.user.find({"y":{"$in":[null], "$exists":true}}) // 仅匹配null值,通过$exists键值为true来判定键已存在
2)正则表达式
正则表达式能够灵活有效的匹配字符串。MongoDB中的正则表达式与javascript的类似。
>db.user.find({"name":/joe/i}) // 匹配姓名为Joe的用户,忽略大小写
3)查询数组
数组可以理解为每个元素都是对应键的值,如:
>db.food.insert({"fruit":["apple","banana","peach"]})
>db.food.find({"fruit":"apple"}) // 该查询会匹配上述插入的文档
4)查询内嵌文档
查询整个文档或只针对其减值对进行查询。使用点表示法查询内嵌的键:
>db.user.find({"name.first":"wang","name.last":"donghong"})
$where查询
比较文档中两个键的值是否相等:
>db.food.find({"$where":function(){
for(var current in this){
for(var other in this){
if(current!=other && this[current]==this[other]){
return true;
}
}
}
return false;
}})
>db.find.find({"$where":"this.x+this.y==10"})
等价于
> db.find.find({"$where":"function(){return this.x+this.y==10;}"})
分页与排序
采用limit、skip和sort来实现限制返回结果的数量、忽略一定数量的结果并排序。
>db.food.find().limit(3) // 限制返回3个文档
>db.food.find().skip(3) // 跳过前3个文档,返回余下的文档。
sort用一个对象作为参数:一组键值对,键对应文档的键名,值代表排序的方向(1表示升序,-1表示降序)。如果指定多个键,则按照键的顺序逐个排序:
>db.user.find().sort({"name":1,"age":-1}) // 按照name升序,age降序
避免使用skip忽略大量结果,因为会变得很慢。
一种分页的思想:先按照某个键进行排序并使用limit限制返回的个数,下一次使用上一次的排序键的最大值作为筛选条件且使用limit,如此反复下去…
更新文档
使用update函数来修改存在数据库中的文档。update有俩个参数:第一个是查询文档,用来找出需要更新的文档,第二个是修改器文档,描述对找到的文档做和修改。
文档替换
使用新的文档来替代匹配到的文档,如:
>db.user.update({"name":"wangdh"},{"age":21,"sex":"男"})
当查询条件匹配到多个文档且第二个参数存在_id键时,会因为插入重复的_id值导致数据库报错。
局部更新:使用修改器
$set修改器:用来指定一个键的值,如果这个键不存在,则创建它,存在则用新指定的值替换该键原来的值,如:
>db.user.update({"name":"wangdh"},{"$set":{"lover":"cxx"}})
$unset修改器可以将指定的键删除掉:
>db.user.update({"name":"wangdh"},{"$unset":{"lover":1}})
$inc修改器:增加已有键的值,不存在时创建
>db.user.update({"name":"wangdh"},{"$inc":{"age":1}}) // 将年龄加1
$inc修改器修改的键的值必须是数字,否则会报错。
数组修改器
只能用在值为数组的键上。
$push修改器:向已有数组的末尾加入一个元素。
>db.blog.post.update({"title":"test"},{"$push":{"comments":{"content":"test content"} }})
$pop修改器:从数组任何一端删除元素,{"$pop":{"key":1}}尾部删除{"$pop":{"key":1}}头部删除。
upset更新:没有记录则插入
通过指定update的第三个参数为true来实现。当有匹配文档时,则进行更新,否则进行插入。
批量更新
通过指定update的第四个参数为true来执行批量更新。当匹配到多个文档且第四个参数为true时,对所有匹配到的文档进行更新操作。
MongoDB学习笔记—03 增删改查操作的更多相关文章
- MongoDB学习笔记,基础+增删改查+索引+聚合...
一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...
- MongoDB学习-->命令行增删改查&JAVA驱动操作Mongodb
MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关 ...
- 【转载】ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查.目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的.下面我们通过创建一个简单的Web API来管理联系 ...
- ASP.NET MVC Web API 学习笔记---联系人增删改查
本章节简单介绍一下使用ASP.NET MVC Web API 做增删改查. 目前很多Http服务还是通过REST或者类似RESP的模型来进行数据操作的. 下面我们通过创建一个简单的Web API来管理 ...
- MyBatis学习之简单增删改查操作、MyBatis存储过程、MyBatis分页、MyBatis一对一、MyBatis一对多
一.用到的实体类如下: Student.java package com.company.entity; import java.io.Serializable; import java.util.D ...
- EF学习笔记——通用增删改查方案
http://blog.csdn.net/leftfist/article/details/25005307 我刚接触EF未久,还不知道它有什么强大之处,但看上去,EF提供了一般的增删改查功能.以往用 ...
- Mybatis学习笔记3 - 增删改查示例
1.接口定义 package com.mybatis.dao; import com.mybatis.bean.Employee; public interface EmployeeMapper { ...
- PHP操作xml学习笔记之增删改查(2)—删、改、查
xml文件 <?xml version="1.0" encoding="utf-8"?><班级> <学生> ...
- PHP操作xml学习笔记之增删改查(1)—增加
xml文件 <?xml version="1.0" encoding="utf-8"?><班级> <学生> ...
随机推荐
- sed 命令使用
ios 的sed 命令 跟linux sed 命令有区别 # 所有的a 替换成b sed -i "" 's/a/b/g' #删除掉所有包含a的行 sed -i "/a/ ...
- 【Python全栈笔记】01 [模块二] 14-15 Oct 运算符和字符串 4-1
编码的问题 中文版 Windows 终端是默认GBK编码格式,python2默认为ASCII编码,虽然我们注释了需要用UTF-8,但是通过命令行运行的文件如果print中文内容还是会出现乱码. Uni ...
- HttpTool.java(在java tool util工具类中已存在) 暂保留
HttpTool.java 该类为java源生态的http 请求工具,不依赖第三方jar包 ,即插即用. package kingtool; import java.io.BufferedReader ...
- SpringMVC集成缓存框架Ehcache
在互联网应用中,应用并发比传统企业及应用会高出很多.解决并发的根本在于系统的响应时间与单位时间的吞吐量.思路可分为:一减少系统的不必要开支(如缓存),二是提高系统单位时间内的运算效率(如集群). 在硬 ...
- 根据UIColor对象,获取对应的RGBA值
- (NSArray *)getRGBWithColor:(UIColor *)color { CGFloat red = 0.0; CGFloat green = 0.0; CGFloat blue ...
- Linux 中 Vi 编辑器的简单操作
Linux 中 Vi 编辑器的简单操作 Vi 编辑器一共有3种模式:命名模式(默认),尾行模式,编辑模式.3种模式彼此需要切换. 一.进入 Vi 编辑器的的命令 vi filename //打开或新 ...
- SQL Server 获取最后一天(指定时间的月最后一天日期)
/* author OceanHo @ 2015-10-23 10:14:21 获取指定时间字符串指定日期的月最后一天日期 */ IF OBJECT_ID('get_LastDayDate') IS ...
- 内省、JavaBean、PropertyDescriptor类、Introspector类、BeanUtils工具包、注解、Rentention、Target、注解的基本属性和高级属性
本文转载自:http://blog.sina.com.cn/s/blog_5d65a16901011kom.html 关键字:内省.JavaBean.PropertyDescriptor类.Int ...
- javascript一些方法兼容
javascript一些方法兼容 标签(空格分隔): javascript 方法收集 [TOC] Object.keys 参考地址 if (!Object.keys) Object.keys = fu ...
- MVC 前台向后台传输数据
今天,我们一起来学习下.MVC如何在前台给后台传输数据 (1)前台传输数据到后台 具体思路:前台拼凑json字符串,然后通过 get 或 post 方式,传递到后台 Action 方法中 我现在前台展 ...