mongodb-aggregate(聚合函数)

mongodb是有自己的mapreduce的,功能很强大,性能也还好,完成了基本上所有的关系型数据库可以完成的统计工作;但是后来mongodb出现了聚合函数,尝试着代替mapreduce,下面开始介绍聚合函数的使用:
aggregate() 方法

MongoDB中聚合的方法使用aggregate()。
语法

aggregate() 方法的基本语法格式如下所示:

db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
db.collection.aggregate(pipeline, options);

pipeline Array

与mysql中的字段对比说明

project10findaggregate使===>,select,select,aggregate, project是取出哪些数据进入下一个阶段管道操作,真正的最终数据返回还是在group等操作中;

$match # 放在group前相当于where使用,放在group后面相当于having使用
match可以用于某个field对应多个value时的查询 match和in搭配使用。

sort # 排序1升-1降 sort一般放在group后,也就是说得到结果后再排序,如果先排序再分组没什么意义;limit # 相当于limit m,不能设置偏移量
$skip # 跳过第几个文档
limit和skip搭配使用相当于关系型数据库的分页功能;但是skip在数据量比较大的时候,会拖慢性能,后面的文档我会继续介绍,怎么合理的使用(自己欠下的,哈哈)

unwind # 把文档中的数组元素打开,并形成多个文档,一般用于查询内嵌数组的时候使用,可以获取到内嵌数组文档的每一个值;  
参考Example1
group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... # 按什么字段分组,注意所有字段名前面都要加 ,mongodb 的是普通常量,其中accumulator又包括以下几个操作符

sum, avg, first, last, max, min, push, addToSet

如果group by null就是 count(*)的效果

db.test.aggregate({_id:null,sum:{“sum”:1}}) ==select c  
ount(*)from table  
如果想实现针对某一列求和,而此时却没  
有比较好的的分组字段,此时可以使用:  db.test.aggregate({_id:null,sum:{“
sum":"$field”}})
实例

集合中的数据如下:
{
_id: ObjectId(7df78ad8902c)
title: ‘MongoDB Overview’,
description: ‘MongoDB is no sql database’,
by_user: ‘w3cschool.cc’,
url: ‘http://www.w3cschool.cc‘,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
},
{
_id: ObjectId(7df78ad8902d)
title: ‘NoSQL Overview’,
description: ‘No sql database is very fast’,
by_user: ‘w3cschool.cc’,
url: ‘http://www.w3cschool.cc‘,
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 10
},
{
_id: ObjectId(7df78ad8902e)
title: ‘Neo4j Overview’,
description: ‘Neo4j is no sql database’,
by_user: ‘Neo4j’,
url: ‘http://www.neo4j.com‘,
tags: [‘neo4j’, ‘database’, ‘NoSQL’],
likes: 750
},
现在我们通过以上集合计算每个作者所写的文章数,使用aggregate()计算结果如下:

db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {$sum : 1}}}])
{
“result” : [
{
“_id” : “w3cschool.cc”,
“num_tutorial” : 2
},
{
“_id” : “Neo4j”,
“num_tutorial” : 1
}
],
“ok” : 1
}

以上实例类似sql语句: select by_user, count(*) from mycol group by by_user
在上面的例子中,我们通过字段by_user字段对数据进行分组,并计算by_user字段相同值的总和。下表展示了一些聚合的表达式:
表达式 描述 实例
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”}}}])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值