@font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5pt; }p.p { margin: 5pt 0pt; text-align: left; font-family: "Times New Roman"; font-size: 12pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

Mongodb除了基本的查询功能,还提供了强大的聚合工具。这一章来看下如何使用聚合进行查询

count:

count是最基本的聚合工具,返回集合中的文档数量:

> db.student_infor.count()

10

还可以设置条件进行查询

> db.student_infor.count({"age":{$gt:19}})

6

distinct:

distinct用来找出制定键的所有不同的值,在使用的时候必须指定集合和键

distinct对应的就是集合名字,key对应的是键。输出结果是student_infor中的age所有的值

> db.runCommand({"distinct":"student_infor","key":"age"})

{ "values" : [ 21, 19, 20, 22, 18 ], "ok" : 1 }

group:

Group大约需要一下几个参数。

1.key:用来分组文档的字段。和keyf两者必须有一个
 2.keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
 3.initial:reduce中使用变量的初始化
 4.reduce:执行的reduce函数。函数需要返回值。
 5.cond:执行过滤的条件。
 6.finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

来看一个具体的例子:

>db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++}})

key:age代表用age来做分组。指定为true那么相同的age将会被分成一组。

initial是指定了一个初始的值,将会在reduce中使用

reduce:每个文档都对应一次这个调用,系统传递两个参数:当前文档和累加器文档。doc代表当前正在迭代的文档,prev就是累加器文档,用来进行各种统计的累加。prev中用到的num就是在intial中初始的值

上面的执行结果如下:统计出了每个年龄的学生个数

[

{

"age" : 21,

"num" : 2

},

{

"age" : 19,

"num" : 1

},

{

"age" : 20,

"num" : 2

},

{

"age" : 22,

"num" : 2

},

{

"age" : 18,

"num" : 3

}

]

对于查询我们还可以使用条件判断进行筛选,方法则是采用condtion

> db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++},condition:{"age":{$gt:20}}})

得到age大于20的分组查询情况。

[ { "age" : 21, "num" : 2 }, { "age" : 22, "num" : 2 } ]

还有另外一种写法:

> db.runCommand({group:{ns:"student_infor",key:{age:true},initial:{num:0},$reduce:function(doc,prev){prev.num++}}})

这里添加了一个ns参数,后面跟的是集合的名字。

aggregate:

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

下表展示了一些聚合的表达式:

表达式

描述

实例

$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"}}}])

来看一个具体的例子:group代表分组,id代表分组的依据,average是新一个新生成的字段。$avg是平均的功能,”$age”代表是对age进行平均

>db.student_infor.aggregate({$group:{_id:"student_id",average:{$avg:"$age"}}})

{ "_id" : "student_id", "average" : 19.9 }

找到age最大的

>db.student_infor.aggregate({$group:{_id:"age",average:{$max:"$age"}}})

{ "_id" : "age", "average" : 22 }

找到age最小的

> db.student_infor.aggregate({$group:{_id:"age",average:{$min:"$age"}}})

{ "_id" : "age", "average" : 18 }

将age字段插入到数组中

> db.student_infor.aggregate({$group:{_id:"age",average:{$push:"$age"}}})

{ "_id" : "age", "average" : [ 21, 19, 20, 22, 18, 18, 22, 21, 20, 18 ] }

对age进行求和

> db.student_infor.aggregate({$group:{_id:"age",average:{$sum:"$age"}}})

{ "_id" : "age", "average" : 199 }

最新文章

  1. Assertion failure in -[UITableView _classicHeightForRowAtIndexPath:], /SourceCache/UIKit_Sim/UIKit-3318/UITableView.m:10772
  2. Java SWT 做计算器。
  3. JavaScript Replace 多个字符
  4. jquery.validate的 使用
  5. python 使用__slots__
  6. Error -27791: Server xx has shut down the connection prematurely
  7. Bootstrap插件的使用
  8. Asp.net开发常用的51个非常实用的代码
  9. MySQLdb autocommit
  10. OpenCV成长之路:图像直方图的应用
  11. BZOJ 1198: [HNOI2006]军机调度(搜索)
  12. CSDN删除上传资源的办法
  13. 使用awk进行日志信息的分组统计
  14. 关于el-dialog,我更推荐的用法
  15. Oracle数据库中插入日期型数据(to_date的用法)(转载)
  16. duilib基本流程
  17. ICL Auto Vectorization
  18. linux下JNI开发—Hello为例
  19. .net Parallel并行使用注意事项
  20. $trainClassLayer.find('input[name=data-item-checkbox]').eq(index).change();//激活第index+1那个checkbox

热门文章

  1. 05深入理解C指针之---指针声明和解引
  2. 算法 & 数据结构——收纳箱算法???
  3. hdu 5019(第K大公约数)
  4. Codeforces Round #442 (Div. 2) Danil and a Part-time Job
  5. Codeforces 23E Tree(树型DP)
  6. [原创][FPGA][IP-Core]altlvds_tx & altlvds_rx
  7. 洛谷—— P2895 [USACO08FEB]流星雨Meteor Shower
  8. [ONTAK2010]Peaks
  9. JavaScript实现弹幕效果
  10. BZOJ 1355 [Baltic2009] Bazinga