翻译自http://www.mongodb.org/display/DOCS/Advanced+Queries部分内容。
其实内容并不难理解,主要照顾英语苦手的兄弟们,也方便自己。
这里主要是讲MongoDB在控制台中如何进行高级查询,既有教程内容,也有ME动手实验的经验,搞懂了这些规则,对于你再使用其他语言(Java,ruby,python等)实现查询时有莫大的帮助,因为基础的是相通的,只是不同的语言实现接口略有差异而已。
还有一句想提醒大家,多动手实验,才是硬道理。
<,>,>=,<=
这四个就不用解释了,最常用的,也是最简单的。
db.collection.find({ "field" : { $gt: value } } ) // 大于 : field > value
db.collection.find({ "field" : { $lt: value } } ) // 小于 : field < value
db.collection.find({ "field" : { $gte: value } } ) // 大于等于 : field >= value
db.collection.find({ "field" : { $lte: value } } ) // 小于等于 : field <= value
如果要同时满足多个条件,记得要这样用:
db.collection.find({ "field" : { $gt: value1, $lt: value2 } } ) // value1 < field < value
$ne 不等于
db.things.find( { x : { $ne : 3 } } )
条件相当于x<>3,即x不等于3。
$mod 取模运算
db.things.find( { a : { $mod : [ 10 , 1 ] } } )
条件相当于a % 10 == 1 即a除以10余数为1的。
$nin 不属于
db.things.find({j:{$nin: [2,4,6]}})
条件相当于 j 不等于 [2,4,6] 中的任何一个。
$in 属于
db.things.find({j:{$in: [2,4,6]}})
条件相当于j等于[2,4,6]中的任何一个。
$all 全部属于
db.things.find( { a: { $all: [ 2, 3 ] } } )
与$in类似,但必须是[]的值全部都存在。
$size 数量,尺寸
db.things.find( { a : { $size: 1 } } )
条件相当于a的值的数量是1(a必须是数组,一个值的情况不能算是数量为1的数组)。
$exists 字段存在
db.things.find( { a : { $exists : true } } )
db.things.find( { a : { $exists : false } } )
true返回存在字段a的数据,false返回不存在字度a的数据。
$type 字段类型
db.things.find( { a : { $type : 2 } } )
条件是a类型符合的话返回数据。
参数类型如下图:
Type Name |
Type Number |
Double |
1 |
String |
2 |
Object |
3 |
Array |
4 |
Binary data |
5 |
Object id |
7 |
Boolean |
8 |
Date |
9 |
Null |
10 |
Regular expression |
11 |
JavaScript code |
13 |
Symbol |
14 |
JavaScript code with scope |
15 |
32-bit integer |
16 |
Timestamp |
17 |
64-bit integer |
18 |
Min key |
255 |
Max key |
127 |
Regular Expressions 正则表达式
db.customers.find( { name : /acme.*corp/i } )
类似sql中的like方法。
行开始 /^ 行结束 $/
这里要特别特别特别地注意一点,关乎查询效率:
While /^a/, /^a./, and /^a.$/ are equivalent and will all use an index in the same way, the later two require scanning the whole string so they will be slower. The first format can stop scanning after the prefix is matched.
意思大概就是指在查询以a开头字符串时,可以有三种形式, /^a/, /^a./,和/^a.$/ 。后面两种形式会扫描整个字符串,查询速度会变慢。第一种形式会在查到符合的开头后停止扫描后面的字符。
所以要特别注意。
几个附加参数:
i的意思是忽略大小写。(这个很重要,很常用)
m的意思是支持多行。(不过ME没有尝试过)
x的意思是扩展。(也没用过)
$or 或 (注意:MongoDB 1.5.3后版本可用)
db.foo.find( { $or : [ { a : 1 } , { b : 2 } ] } )
符合条件a=1的或者符合条件b=2的数据都会查询出来。
与其他字段一起查询:
db.foo.find( { name : "bob" , $or : [ { a : 1 } , { b : 2 } ] } )
符合条件name等于bob,同时符合其他两个条件中任意一个的数据。
Value in an Array 数组中的值
例如数据库中存在这样的数据:
{ "_id" : ObjectId("4c503405645fa23b31e11631"), "colors" : [ "red", "black" ] }
查询
db.things.find( { colors : "red" } );
即可查到上面那条数据。
$elemMatch 要素符合
t.find( { x : { $elemMatch : { a : 1, b : { $gt : 1 } } } } )
结果:
{ "_id" : ObjectId("4b5783300334000000000aa9"),
"x" : [ { "a" : 1, "b" : 3 }, 7, { "b" : 99 }, { "a" : 11 } ]
}
x其中一个要素符合那个检索条件就可以被检索出来。(不过一般谁用像x这样的结构去保存数据呢?)
Value in an Embedded Object 内嵌对象中的值
例如数据库中存在这样的数据:
{ "_id" : ObjectId("4c503773645fa23b31e11632"), "author" : { "name" : "Dan Brown", "age" : 38 }, "book" : "The Lost Symbol" }
查询:
db.postings.find( { "author.name" : "Dan Brown" } );
即可查到上面那条数据。
查询内嵌对象的属性,记得要加上“”,字段是“author.name”,而不是author.name。
$not不是
db.customers.find( { name : { $not : /acme.*corp/i } } );
这是一个与其他查询条件组合使用的操作符,不会单独使用。
只要你理解了前面的查询操作即可,只是再加上了$not,结果就是得到了没有$not的相反结果集。
sort() 排序
这个非常实用。即sql语言中的OrderBy。
db.myCollection.find().sort( { ts : -1 } )
也可以多个字段排序
db.myCollection.find().sort( { ts : -1 ,ds : 1 } )
这里的1代表升序,-1代表降序。
经过ME的实验,小于0的数字就是降序,0以上(包括0)就是升序。
limit() skip()
这两个ME想连起来讲,他们就是你实现数据库分页的好帮手。
limit()控制返回结果数量,如果参数是0,则当作没有约束,limit()将不起作用。
skip()控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条。
例如:
db.test.find().skip(5).limit(5)
结果就是取第6条到第10条数据。
snapshot() (没有尝试)
count() 条数
返回结果集的条数。
db.test.count()
在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数。
例子如下:
> db.test.find().skip(5).limit(5).count()
9
> db.test.find().skip(5).limit(5).count(true)
4
相关推荐
MongoDB 高级查询用法大全 MongoDB 作为一个 NoSQL 数据库,提供了多种高级查询方式,以下是 MongoDB 高级查询用法大全: 一、比较运算符 在 MongoDB 中,比较运算符用于比较字段的值,常用的比较运算符有: * $...
MongoDB高级查询
mongod高级查询语句,Javascript查询和$where查询,正则表达式匹配
前端 Vue+Node+MongoDB高级全栈开发
使用聚合管道可以对集合中的文档进行变换和组合,常用于多表关联查询、数据的统计。 db.COLLECTION_NAME.aggregate() 方法用来构建和使用聚合管道,下图是官网给的实例,可以看出来聚合管道的用法还是比较简单的。 ...
Mongodb视频-燕十八 mongodb视频教程全集21讲+mongodb高级实战开发视频教程
MongoDB高级技术栈全覆盖 前端 Vue+Node+MongoDB高级全栈开发
MongoDB高级索引.pdf 学习资料 复习资料 教学资源
视频详细讲解,需要的小伙伴自行网盘下载,链接见附件,永久有效。 MongoDB是一个开源、高性能、无模式的文档型...高级进阶部分 章节一:索引 章节二:特殊集合 章节三:副本集 章节四:分片集群 章节五:安全认证
1.分篇章进行学习,内容控制30分钟内 2.1个月疗程,不要放弃治疗哦 3.图文并茂,有问题请发到邮箱
MongoDB高级应用场景及技术特点分析.pptx
前端Vue+Node+MongoDB高级全栈开发系列课程
一、MongoDB 聚合管道(Aggregation Pipeline) 二、MongoDB Aggregation 管道操作符与表达式 三、 数据模拟
第32集 Mongodb高级查询操作 34分钟 第33集 Mongodb高级更改操作 41分钟 第 10 章: Mongodb数据库(下) 第34集 Mongodb性能优化 44分钟 第35集 Mongodb数据库和架构管理 54分钟 第36集 Mongodb与php开发结合
本课程是一套关于MongoDB应用开发的实战性教程,名为《深入浅出MongoDB应用实战开发(基础、开发指南、系统管理、集群及系统架构)》,教程侧重于讲解MongoDB的常用特性及高级特性,从实际开发的角度出发对MongoDB...
13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群架构详解_ev.rar13、MongoDB分片集群&高级集群...
mongod.exe --install --dbpath=d:\mongodb\data --logpath=d:\mongodb\log\log.log -auth -serviceName "serviceName" 2.卸载服务 mongod.exe --remove --serviceName "serviceName" 3.启动服务 ...
讲述了如何执行基本的写操作以及如何执行各种复杂的条件查询,还介绍了索引、聚合工具以及其他高级查询技术,另外对监控、安全性和身份验证、备份和修复、水平扩展MongoDB数据库等内容也有所涉及。《MongoDB权威指南...