php mongodb的聚合的表达式,MongoDB聚合

聚合操作处理数据记录并返回计算结果。 聚合操作将多个文档中的值组合在一起,并可对分组数据执行各种操作,以返回单个结果。 在SQL中的 count(*)与group by组合相当于mongodb 中的聚合功能。

aggregate()方法

对于MongoDB中的聚合,应该使用aggregate()方法。

语法

aggregate()方法的基本语法如下 -

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

示例

假设在集合中,有以下数据 -

db.article.insert([

{

_id: 100,

title: 'MongoDB Overview',

description: 'MongoDB is no sql database',

by_user: 'Maxsu',

url: 'http://www.yiibai.com',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 100

},

{

_id: 101,

title: 'NoSQL Overview',

description: 'No sql database is very fast',

by_user: 'Maxsu',

url: 'http://www.yiibai.com',

tags: ['mongodb', 'database', 'NoSQL'],

likes: 10

},

{

_id: 102,

title: 'Neo4j Overview',

description: 'Neo4j is no sql database',

by_user: 'Kuber',

url: 'http://www.neo4j.com',

tags: ['neo4j', 'database', 'NoSQL'],

likes: 750

},

{

_id: 103,

title: 'MySQL Overview',

description: 'MySQL is sql database',

by_user: 'Curry',

url: 'http://www.yiibai.com/mysql/',

tags: ['MySQL', 'database', 'SQL'],

likes: 350

}])

现在从上面的集合中,如果要显示一个列表,说明每个用户写入了多少个教程,那么可使用以下aggregate()方法 -

> db.article.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

{ "_id" : "Curry", "num_tutorial" : 1 }

{ "_id" : "Kuber", "num_tutorial" : 1 }

{ "_id" : "Maxsu", "num_tutorial" : 2 }

>

对于上述用例的Sql等效查询是:

select by_user, count(*) as num_tutorial from `article` 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

根据分组从源文档获取第一个文档。 通常情况下,这只适用于以前应用的“$sort”阶段。

db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

$last

根据分组从源文档获取最后一个文档。通常情况下,这只适用于以前应用的“$sort”阶段。

db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

管道概念

在UNIX命令中,shell管道可以对某些输入执行操作,并将输出用作下一个命令的输入。 MongoDB也在聚合框架中支持类似的概念。每一组输出可作为另一组文档的输入,并生成一组生成的文档(或最终生成的JSON文档在管道的末尾)。这样就可以再次用于下一阶段等等。

以下是在聚合框架可能的阶段 -

$project - 用于从集合中选择一些特定字段。

$match - 这是一个过滤操作,因此可以减少作为下一阶段输入的文档数量。

$group - 这是上面讨论的实际聚合。

$sort - 排序文档。

$skip - 通过这种方式,可以在给定数量的文档的文档列表中向前跳过。

$limit - 限制从当前位置开始的给定数量的文档数量。

$unwind - 用于展开正在使用数组的文档。使用数组时,数据是预先加入的,此操作将被撤销,以便再次单独使用文档。 因此,在这个阶段,将增加下一阶段的文件数量。

¥ 我要打赏

纠错/补充

收藏

加QQ群啦,易百教程官方技术学习群

注意:建议每个人选自己的技术方向加群,同一个QQ最多限加 3 个群。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值