MongoDB学习(三)

时间:2021-01-21 06:11:19

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教程