1. WHERE语句
操作 | 格式 | 范例 | RDBMS中的类似语句 |
---|---|---|---|
等于 | {< key>:< value>} | db.coll.find({“by”:“java”}).pretty() | where by = ‘java’ |
小于 | {< key>:{$lt:< value>}} | db.coll.find({“likes”:{$lt:50}}).pretty() | where likes < 50 |
小于或等于 | {< key>:{$lte:< value>}} | db.coll.find({“likes”:{$lte:50}}).pretty() | where likes <= 50 |
大于 | {< key>:{$gt:< value>}} | db.coll.find({“likes”:{$gt:50}}).pretty() | where likes > 50 |
大于或等于 | {< key>:{$gte:< value>}} | db.coll.find({“likes”:{$gte:50}}).pretty() | where likes >= 50 |
不等于 | {< key>:{$ne:< value>}} | db.coll.find({“likes”:{$ne:50}}).pretty() | where likes != 50 |
2. AND条件
MongoDB的find()方法可以传入多个键(key),每个键(key)以逗号隔开,即常规SQL的AND条件
db.coll.find({key1:value1, key2:value2}).pretty()
3. OR条件
MongoDB的OR条件语句使用了关键字**$or**,语法格式如下:
db.coll.find({$or: [{key1: value1}, {key2:value2}]}).pretty()
4. 条件操作符
条件操作符用于比较两个表达式并从mongoDB集合中获取数据
MongoDB中条件操作符有:
- 大于 – > – $gt
- 小于 – < – $lt
- 大于等于 – >= – $gte
- 小于等于 – <= – $lte
例:db.coll.find({likes : {$gt : 100}})
类似于SQL语句:select * from coll where likes > 100;
5. $type操作符
$type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果
MongoDB中可以使用的类型如下表所示:
类型 | 数字 | 备注 |
---|---|---|
Double | 1 | |
String | 2 | |
Object | 3 | |
Array | 4 | |
Binary data | 5 | |
Undefined | 6 | 已废弃 |
Object id | 7 | |
Boolean | 8 | |
Date | 9 | |
Null | 10 | |
Regular Expression | 11 | |
JavaScript | 12 | |
Symbol | 13 | |
JavaScript(with scope) | 14 | |
32-bit integer | 15 | |
Timestamp | 16 | |
64-bit integer | 17 | |
Min key | 18 | |
Max key | 255 | Query with -1 |
例:如果想获取"coll"集合中title为String的数据,可以使用以下命令:
db.coll.find({"title":{$type:2}})
或 db.coll.find({"title":{$type:'string'}})
6. limit()方法
如果需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数
语法格式:db.collection.find().limit(number)
注:如果没有指定limit()方法中的参数则显示集合中的所有数据
7. skip()方法
除了可以使用limit()方法来读取指定数量的数据外,还可以使用skip()方法来跳过指定数量的数据,skip方法同样接受一个数字参数作为跳过的记录条数
语法格式:db.collection.find().limit(number).skip(number)
注:skip()方法默认参数为0
8. sort()排序
在MongoDB中使用sort()方法对数据进行排序,sort()方法可以通过参数指定排序的字段,并使用1和-1来指定排序的方式,其中1为升序排列,而-1为降序排列
语法格式:db.collection.find().sort({KEY:1})
9. createIndex()索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录
MongoDB使用createIndex()方法来创建索引
注意在3.0.0版本前创建索引方法为db.collection.ensureIndex(),之后的版本使用了db.collection.createIndex()方法,ensureIndex()还能用,但只是createIndex()的别名
语法格式:db.collection.createIndex(keys,options)
语法中Key值为要创建的索引字段,1按升序创建索引,-1按降序来创建索引
createIndex()方法中也可以设置使用多个字段创建索引(关系型数据库中称作复合索引)
createIndex()接收可选参数,可选参数列表如下:
参数 | 类型 | 描述 |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加"background"可选参数;"background"默认值为false |
unique | Boolean | 建立的索引是否唯一;指定为true创建唯一索引;默认值为false |
name | string | 索引的名称;如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称 |
dropDups | Boolean | 3.0+版本已废弃;在建立唯一索引时是否删除重复记录,指定true创建唯一索引;默认值为 false |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档;默认值为false |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间 |
v | index version | 索引的版本号;默认的索引版本取决于mongod创建索引时运行的版本 |
weights | document | 索引权重值,数值在1到99999之间,表示该索引相对于其他索引字段的得分权重 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表;默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为language |
10. aggregate()聚合
MongoDB中聚合aggregate()主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果,有点类似sql语句中的count(*)
语法格式:db.collection.aggregate(AGGREGATE_OPERATION)
聚合一些表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {** s u m ∗ ∗ : " sum** : " sum∗∗:"likes"}}}]) |
$avg | 计算平均值 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {** a v g ∗ ∗ : " avg** : " avg∗∗:"likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {** m i n ∗ ∗ : " min** : " min∗∗:"likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", num_tutorial : {** m a x ∗ ∗ : " max** : " max∗∗:"likes"}}}]) |
$push | 在结果文档中插入值到一个数组中 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {** p u s h ∗ ∗ : " push**: " push∗∗:"url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", url : {** a d d T o S e t ∗ ∗ : " addToSet** : " addToSet∗∗:"url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", first_url : {** f i r s t ∗ ∗ : " first** : " first∗∗:"url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.coll.aggregate([{KaTeX parse error: Expected '}', got 'EOF' at end of input: …roup : {_id : "by_user", last_url : {** l a s t ∗ ∗ : " last** : " last∗∗:"url"}}}]) |
11. 管道的概念
管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理;管道操作是可以重复的
表达式:处理输入文档并输出;表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档
聚合框架中常用的几个操作:
- $project:修改输入文档的结构;可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档
- $ match:用于过滤数据,只输出符合条件的文档;$match使用MongoDB的标准查询操作
- $limit:用来限制MongoDB聚合管道返回的文档数
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值
- $group:将集合中的文档分组,可用于统计结果
- $sort:将输入文档排序后输出
- $geoNear:输出接近某一地理位置的有序文档
12. MongoDB监控
MongoDB中提供了mongostat和mongotop两个命令来监控MongoDB的运行情况
mongostat命令
mongostat是mongodb自带的状态检测工具,在命令行下使用;它会间隔固定时间获取mongodb的当前运行状态,并输出;如果发现数据库突然变慢或者有其他问题的话,首先考虑采用mongostat来查看mongo的状态
启动Mongod服务,进入到安装的MongoDB目录下的bin目录, 然后输入mongostat命令
mongotop命令
mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据; mongotop提供每个集合的水平的统计数据;默认情况下,mongotop返回值的每一秒
启动Mongod服务,进入到安装的MongoDB目录下的bin目录, 然后输入mongotop命令
mongotop 10
:10是< sleeptime>参数,可以不使用,等待的时间长度,以秒为单位,mongotop等待调用时间;默认是每一秒返回一次数据
mongotop --locks
:报告每个数据库的锁的使用情况
输出结果字段说明:
- ns:包含数据库命名空间,后者结合了数据库名称和集合
- db:包含数据库的名称;名为. 的数据库针对全局锁定,而非特定数据库
- total:mongod花费的时间工作在这个命名空间提供总额
- read:提供了大量的时间,这mongod花费在执行读操作,在此命名空间
- write:提供这个命名空间进行写操作,这mongod花了大量的时间