首页 > 代码库 > MongoDB查询、索引和聚合

MongoDB查询、索引和聚合

初始化mongodb数据库

> use deng
switched to db deng
> db.createCollection("jingdong")            #无參数
{"ok":1}
> show collections
jingdong
system.indexes
> userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })        
> userdoc2=({"user_id":2,"name":"testadmin","state":"active","actor":"admin","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-11","hour":"06:34 AM"}] })    
> doc=({"name":"peter","position":"teacher"})
> db.jingdong.insert(userdoc1)
WriteResult({"nInserted":1})
> db.jingdong.insert(userdoc2)
WriteResult({"nInserted":1})
> db.jingdong.insert(doc1)
WriteResult({"nInserted":1})

查询语句

db.jingdong.find() #相当于select * from jingdong;


条件操作符
mongodb中的条件操作符有:
(>) 大于 - \$gt #greate
(<) 小于 - \$lt #low
(>=) 大于等于 - \$gte #equal
(<= ) 小于等于 - \$lte

样例:
> db.jingdong.find({user_id:{$gt:1}})
> db.jingdong.find({user_id:{$lte:2,$gt:1}})



#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.jingdong.find({"name":{$type:2}}) #查找name是字符串的文档记录



limit和skip


读取指定数量的数据记录 limit
db.shiyanlou.find().limit(1) #读取一条记录,默认是排在最前面的那一条被读取

读取时跳过指定数量的数据记录 skip
db.shiyanlou.find().limit(1).skip(1)
 

MongoDB排序 -sort()

与sqlite中的排序一样有升序和降序,当中升序用1表示,降序用-1表示 
db.jingdong.find().sort({"time":1})

索引 - ensureIndex()

索引通常可以极大的提高查询的效率,假设没有索引,MongoDB在读取数据时必须扫描集合中的每一个文件并选取那些符合查询条件的记录。这样的扫描全集合的查询效率是很低的,特别在处理大量的数据时。查询可以要花费几十秒甚至几分钟。无疑对站点的性能是很致命的。

索引是特殊的数据结构。索引存储在一个易于遍历读取的数据集合中。索引是对数据库集合中一个文档或多个文档的值进行排序的一种结构。

db.COLLECTION_NAME.ensureIndex({KEY:1|-1})
> db.shiyanlou.ensureIndex({"name":1}) #1代表升序 -1代表降序
> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})



                                                         ensureIndex參数表格例如以下:
參数类型描写叙述
backgroundBoolean建立索引要不要堵塞其它数据库操作,默觉得false
uniqueBoolean建立的索引是否唯一,默认false
namestring索引的名称。若未指定。系统自己主动生成
dropDupsBoolean建立唯一索引时。是否删除反复记录。默认flase
sparseBoolean对文档不存在的字段数据不启用索引。默认false
expireAfterSecondsinteger设置集合的生存时间,单位为秒
vindex version索引的版本
weightsdocument索引权重值,范围为1到99999
default-languagestring默觉得英语
language_overridestring默认值为 language

聚合 -aggregate()

db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})

$match:查询。跟find一样;
$limit:限制显示结果数量;
$skip:忽略结果数量。
$sort:排序;
$group:依照给定表达式组合结果。


> db.jingdong.aggregate([{$group:{_id:"$name", user:{$sum:"$user_id"}}}])


名称描写叙述
$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}


MongoDB查询、索引和聚合