mongo 学习笔记
select * from table where id < 10 order by time desc limit 1
update table set time = ''
insert table (a,b,c) values(1,2,3),(4,5,6)
delete from table where id < 10
db.table.find({id:{$gt:10}}).limit(1)
db.table.update({time:"12345678899"})
db.table.remove({id{$gt:10}})
条件操作符1
mongodb中的条件操作符有:
- (>) 大于 - \$gt #greate
- (<) 小于 - \$lt #low
- (>=) 大于等于 - \$gte #equal
- (<= ) 小于等于 - \$lte
范例:
> db.shiyanlou.find({user_id:{$gt:1}})
> db.shiyanlou.find({user_id:{$lte:2,$gt:1}})
条件操作符2
语法:
$type
type的值:
- 双精度型-1
- 字符串-2
- 对象-3
- 数组-4
- 二进制数据-5
- 对象ID-7
- 布尔类型-8
- 数据-9
- 空-10
- 正则表达式-11
- JS代码-13
- 符号-14
- 有作用域的JS代码-15
- 32位整型数-16
- 时间戳-17
- 64位整型数-18
- Min key-255
- Max key-127
范例:
> db.shiyanlou.find({"name":{$type:2}})
limit与skip
读取指定数量的数据记录 -limit
范例:
> db.shiyanlou.find().limit(1)
读取一条记录,默认是排在最前面的那一条被读取
读取时跳过指定数量的数据记录 -skip
范例:
> db.shiyanlou.find().limit(1).skip(1)
当然,还可以添加find的查找条件的参数,以便进行更精确的查找
MongoDB排序 -sort()
与sqlite中的排序一样有升序和降序,其中升序用1表示,降序用-1表示 语法:
db.COLLECTION_NAME.find().sort({KEY:1|-1})
范例:
> db.shiyanlou.find().sort({"time":1})
三、索引 - ensureIndex()
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,无疑对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构。
语法:
db.COLLECTION_NAME.ensureIndex({KEY:1|-1})
同样1代表升序,-1代表降序
范例:
> db.shiyanlou.ensureIndex({"name":1})
ensureIndex()的可选参数:
参数 | 类型 | 描述 |
---|---|---|
background | Boolean | 建立索引要不要阻塞其他数据库操作,默认为false |
unique | Boolean | 建立的索引是否唯一,默认false |
name | string | 索引的名称,若未指定,系统自动生成 |
dropDups | Boolean | 建立唯一索引时,是否删除重复记录,默认flase |
sparse | Boolean | 对文档不存在的字段数据不启用索引,默认false |
expireAfterSeconds | integer | 设置集合的生存时间,单位为秒 |
v | index version | 索引的版本号 |
weights | document | 索引权重值,范围为1到99999 |
default-language | string | 默认为英语 |
language_override | string | 默认值为 language |
范例:
> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})
四、聚合 -aggregate()
语法:
db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})
这些参数都可选
- $match:查询,跟find一样;
- $limit:限制显示结果数量;
- $skip:忽略结果数量;
- $sort:排序;
- $group:按照给定表达式组合结果。
范例:
> db.shiyanlou.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])
$name意为取得name的值
聚合表达式
名称 | 描述 |
---|---|
$sum | 计算总和 |
$avg | 计算平均值 |
\$min和$max | 计算最小和最大值 |
$push | 在结果文档中插入值到一个数组 |
$addToSet | 在结果文档中插入值到一个数组,但不创建副本 |
$first | 根据资源文档的排序获取第一个文档数据 |
$last | 根据资源文档的排序获取最后一个文档数据 |
管道
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。 聚合框架中常用的几个操作:
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- \$match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
范例:
> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
{"_id":"user","count":2}
四、原子操作
所谓原子操作,就是要么执行成功,要么执行失败,执行成功完成既定任务,执行失败还原执行前的状态。 常用原子操作命令:
$set
用来指定一个键并更新键值,若键不存在并创建。
{ $set : { field : value } }
$unset
用来删除一个键。
{ $unset : { field : 1} }
$inc
$inc可以对文档的某个值为数字型(只能为满足要求的数字)的键进行增减的操作。
{ $inc : { field : value } }
$push
把value追加到field里面去,field一定要是数组类型才行,如果field不存在,会新增一个数组类型加进去。
{ $push : { field : value } }
$pushAll
同$push,只是一次可以追加多个值到一个数组字段内。
{ $pushAll : { field : value_array } }
$pull
从数组field内删除一个等于value值。
{ $pull : { field : _value } }
$addToSet
增加一个值到数组内,而且只有当这个值不在数组内才增加。
$pop
删除数组的第一个或最后一个元素
{ $pop : { field : 1 } }
$rename
修改字段名称
{ $rename : { old_field_name : new_field_name } }
$bit
位操作,integer类型
{$bit : { field : {and : 5}}}
五、查询分析
explain()
explain 操作提供了查询信息,使用索引及查询统计等。有利于我们对索引的优化。接下来我们在 users 集合中创建 gender 和 user_name 的索引:
> db.users.ensureIndex({gender:1,user_name:1})
> db.users.find({gender:"M"},{user_name:1,_id:0}).explain()
结果中字段解释:
- indexOnly:为 true ,表示我们使用了索引;
- cursor:因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这是也使用了BtreeCursor类型的游标。如果没有使用索引,游标的类型是BasicCursor。这个键还会给出你所使用的索引的名称,你通过这个名称可以查看当前数据库下的system.indexes集合(系统自动创建)来得到索引的详细信息;
- n:当前查询返回的文档数量;
- nscanned/nscannedObjects:表明当前这次查询一共扫描了集合中多少个文档,我们的目的是,让这个数值和返回文档的数量越接近越好;
- millis:当前查询所需时间,毫秒数;
- indexBounds:当前查询具体使用的索引。
hint()
虽然MongoDB查询优化器一般工作的很不错,但是也可以使用hints来强迫MongoDB使用一个指定的索引。 通过这种方法在某些情形下会提升性能。 范例:指定使用 gender 和 user_name 索引字段来查询:
> db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})
可以使用 explain() 函数来分析以上查询:
> db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
六、小结
本节讲解了MongoDB的高级查询与索引,支持索引子文档字段,支持原子操作,explain可以用于查询分析,hint可以强制指定使用哪一个索引。
var c = db.testData.find() |
1
|
while ( c.hasNext() ) printjson( c.next() ) |
mongo 学习笔记的更多相关文章
- mongo学习笔记(六):linux上搭建
linux分以下几台 monogos mongocfg mongod1 mongod2 1.用ssh把 mongodb-linux-x86_64-3.0.6.tgz 移到linux /root上 2. ...
- mongo学习笔记(五):分片
分片 人脸: 代表客户端,客户端肯定说,你数据库分片不分片跟我没关系,我叫你干啥就干啥,没什么好商量的. mongos: 首先我们要了解”片键“的概念,也就是说拆分集合的依据是什么?按照 ...
- mongo学习笔记2--索引及表设计
-背景: 鉴于我们使用mongo作为数据库,期间少不了需要添加索引和对业务表进行设计.因此以下我对mongo索引及表设计原则做了一些分享.希望对大家有用,如有错误还望指正~ MongDB的索引类型简介 ...
- Mongo学习笔记
安装和开始 下载 MongoDB 参考:+MongoDB安装配置(Windows) +Mongo手册
- mongo学习笔记---1
mongo简介 非结构化数据库,数据都是以Bson格式(json的二进制)存储的. 特点:不需要指定表结构,存在一张表里的数据其结构可以完全不同.内部执行引擎为JS解释器, 把文档存储成bson结构, ...
- mongo学习笔记(一):增删改查
安装:我是按这篇来弄的 一.Insert 1.db.person.insert({"name":"jack","age":20}) 2.va ...
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记—权限管理
1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b ...
- MongoDB学习笔记~环境搭建
回到目录 Redis学习笔记已经告一段落,Redis仓储也已经实现了,对于key/value结构的redis我更愿意使用它来实现数据集的缓存机制,而对于结构灵活,查询效率高的时候使用redis就有点不 ...
随机推荐
- Java遇见HTML——JSP篇之JavaBeans
一.JavaBean简介及设计原则 设计原则:公有类.无参的公有构造方法.属性私有.有getter and setter方法 实例: 二.Jsp动作元素 JSP动作标签分为五大类: 三.在JSP页面中 ...
- API文档的阅读
API ——Application Programming Interface(应用程序编程接口) API是应用程序接口的意思,API是Java提供的基本编程接口,当使用Java语言进行编程时,不可能 ...
- VMWare ESXi 5.5安装及配置
VMWare ESXi 5.5安装大概过程如下:制作虚拟化ESXi系统的USB启动盘,安装ESXi系统到USB,用USB启动ESXi系统.比较难理解,下面图解过程. 下载UNetbootin (下 ...
- [GDAL]读取HDF格式的calipso数据
探测地球云层分布的CloudSat和CALIPSO卫星 http://www.nasa.gov/mission_pages/calipso/main/index.html http://www.nas ...
- nginx + keepalived 双机热备
序 双机热备是指两台机器都在运行,但并非两台机器同时在提供服务. 当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,且切换的时间非常短. keepalived的工作原理是VRRP—— ...
- iOS UICollectionView之三(基本用法)
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- Java Servlet(一):创建工程(jdk7+tomcat7+eclipse)
本篇文件主要记录下怎么在jdk7+tomcat7下,使用eclipse创建并运行一个servlet工程. 安装具体步骤从网上搜索就可以找到,这里不再赘述. 在eclipse中切换到j2ee下, 从导航 ...
- Python:安装mssql模块功能,并实现与sqlserver连接、查询
由于我系统是x64系统,所以下载python2.7 x64.下载地址:https://www.python.org/downloads/release/python-2712/, 经过测试发现这个版本 ...
- 从零开始攻略PHP(4)——数组的使用
1.数组的概念 数组就是一个用来存储一系列变量值的命名区域. 每个数组元素有一个相关的索引(也成为关键字),它可以用来访问元素. PHP允许间隔性地使用数字或字符串作为数组的索引. 2.数字索引数组 ...
- DB2数据库管理最佳实践(1)
1.DB2 9的新特性 1)DB2 9.1:主要是增加了原生XML,表分区和表压缩功能.从构架上,总的进程模型和内存构架看,都和8没啥区别. DB2 中的 pureXML 支持为管理 XML 数据提供 ...