MongoDB条件操作符
- $gt > 大于
- $lt < 小于
- $gte >= 大于等于
- $lte <= 小于等于
- $ne != 不等于
条件操作符可用于查询语句中,帮助刷选查询结果。
用法:{field:{条件操作符 : value}} 表示该字段的值符合条件操作符所表示的关系
示例:db.cols.find("age":{$gt: 20})
表示在当前数据库的cols集合中查找出age>20的文档。
条件操作符不仅能对数字进行比较,对字符串也能进行比较。
表示大于且小于
示例:db.cols.find("age":{$lt:25, $gt:22})
注:大于小于在一个{}内。
MongoDB类型操作符
$type:类型操作符,用于筛选出某个字段的值为某个类型的文档。
用法:{$type : value}
每个类型对应一个value,参见下表:
类型 | value | 备注 |
---|---|---|
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 | 13 | |
Symbol | 14 | |
JavaScript (with scope) | 15 | |
32-bit integer | 16 | |
Timestamp | 17 | |
64-bit integer | 18 | |
Min key | 255 | Query with -1. |
Max key | 127 |
示例:db.cols.find("filed_name":{$type : 2})
表示在当前数据库的cols集合中查找出符合"filed_name"这个字段值为String的文档。
MongoDB的limit()和skip()方法
limit()方法可以限制查询的文档数,如果结果大于限制的数量,那么只显示出限制容量大小的文档组。
用法:db.cols.find().limit(LIMIT_NUM)
注:不填LIMIT_NUM时默认显示一条
skip()方法可以跳过一定数量的文档之后进行查找。
用法:db.cols.find().skip(SKIP_NUM)
注:不填SKIP_NUM时出错。
limit()和skip()可以混合使用,但db.cols.find().limt(3).skip(1)和db.cols.find().skip(1).limit(3)意义相同,都表示跳过一个记录,限制查找到的之后三条。
还有一点需要注意的是当重复使用limt()时,结果也会被多次筛选。如:db.cols.find().limit(3).limit(1)最后只显示一条文档。
MongoDB的sort()排序
用法:db.cols.find().sort({field:1或-1}) 1表示升序,-1表示降序,filed表示所要根据排序的字段。如果某文档没有该字段,那么会被默认成最小值,排在之前。
MongoDB索引
MongoDB中的索引和关系型数据库下的索引概念基本一致,都是为了能够在大量的数据下快速的查找出所需的数据。
创建索引:
用法:db.cols.ensureIndex({field1:1|-1,field2:1|-1...})
表示根据字段field1,(field2等...)创建索引,其中的1和-1表示升序或者降序。当只有一个字段时,所创建的就单个索引(单个索引的升序、降序效果相同)。当有多个字段时,创建的索引即是复合索引。
ensureIndex()还可接受一些可选参数,用于设置索引的属性。
用法:db.cols.ensureIndex({filed1:1|1,field2:1|1},{可选参数1:value, 可选参数2:value...})
可选参数列表如下:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称,如:field1_1_field2_1 |
dropDups | Boolean | 在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false. |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language. |
索引创建完成后,可以通过db.cols.getIndexes()来查看cols集合下全部的索引。
或是用过db.system.index.find()来查看当前数据库下的全部索引。(自己验证时,发现没有打印出记录)
删除索引:可以通过db.cols.dropIndexes()来删除全部的索引,但是不包括默认的_id字段的索引。
重建索引:可以通过db.cols.reIndex()
MongoDB中的聚合
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
db.cols.aggregate([Array])
Array中可以填入多个表达式。
表达式:处理输入文档并输出。表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档。
- $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
- $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
- $limit:用来限制MongoDB聚合管道返回的文档数。
- $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
- $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
- $group:将集合中的文档分组,可用于统计结果。
- $sort:将输入文档排序后输出。
- $geoNear:输出接近某一地理位置的有序文档。
示例:
> db.testdb.find()
{ "_id" : ObjectId("56aa0374f593495aa9328e3c"), "name" : "A", "age" : , "gender" : "f" }
{ "_id" : ObjectId("56aa0380f593495aa9328e3d"), "name" : "B", "age" : , "gender" : "f" }
{ "_id" : ObjectId("56aa03a4f593495aa9328e3e"), "name" : "C", "age" : , "gender" : "m" }
{ "_id" : ObjectId("56aa03bdf593495aa9328e3f"), "name" : "D", "age" : , "gender" : "f" }
{ "_id" : ObjectId("56aa03ccf593495aa9328e40"), "name" : "E", "age" : , "gender" : "m" }
{ "_id" : ObjectId("56aa03fcf593495aa9328e41"), "name" : "F", "age" : , "gender" : "f" }
{ "_id" : ObjectId("56aa040df593495aa9328e42"), "name" : "G", "age" : , "gender" : "m" }
>
对该集合进行聚合,来统计各个性别的人数,
> db.testdb.aggregate([{$group:{"_id":"$gender",count : {$sum : }}}])
{ "_id" : "m", "count" : }
{ "_id" : "f", "count" : }
>
如果想对文档在进行筛选,可以增加$match,
> db.testdb.aggregate([{$match:{"age":}},{$group:{"_id":"$gender",count : {$sum : }}}]) { "_id" : "m", "count" : }
{ "_id" : "f", "count" : }
对年龄为24的文档进行按性别统计。
下表展示了一些聚合的表达式:
表达式 | 描述 | 实例 |
---|---|---|
$sum | 计算总和。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min | 获取集合中所有文档对应值得最小值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max | 获取集合中所有文档对应值得最大值。 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push | 在结果文档中插入值到一个数组中。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet | 在结果文档中插入值到一个数组中,但不创建副本。 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first | 根据资源文档的排序获取第一个文档数据。 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last | 根据资源文档的排序获取最后一个文档数据 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
参考:MongoDB教程