聚合操作处理数据记录并返回计算输出,聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个输出。在SQL中,count(*)和group by等效于mongodb聚合。
对于MongoDB中的聚合,您应该使用 aggregate()方法。
aggregate()方法的基本语法如下-
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
在集合中,您具有以下数据-
{ _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'Learnfk point', url: 'http://www.learnfk.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'Learnfk point', url: 'http://www.learnfk.com', 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" : "Learnfk point", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 } >
对于上述用例的Sql等价查询将是从by byuser的mycol组中选择by_user,count(*)。
链接:https://www.learnfk.comhttps://www.learnfk.com/mongodb/mongodb-aggregation.html
来源:LearnFk无涯教程网
在上面的示例中,无涯教程已将文档按字段 by_user 分组,并且每次出现by_user时,sum的先前值都会增加。以下是可用的聚合表达式的列表。
Expression | Remark | Example |
---|---|---|
$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"}}}]) |
在UNIX命令中,管道意味着可以对某些输入执行操作,并将输出用作下一条命令的输入,依此类推, MongoDB在聚合框架中也支持相同的概念。有一组可能的阶段,每个阶段都作为一组文档作为输入,并生成一组输出文档,然后可以将其用于下一阶段,依此类推。
以下是聚合框架中的可能阶段-
$project - 用于从集合中选择某些特定字段。
$match - 这是一项过滤操作,因此可以减少作为下一阶段输入的文档数量。
$group - 这是如上所述的实际汇总。
$sort - 对文档进行排序。
$skip - 这样,就可以在给定数量的文档中向前跳过文档列表。
$limit - 从当前位置开始,以给定的编号限制要查看的文档数量。
$unwind - 用于展开使用数组的文档,当使用数组时,数据是一种预连接的,并且此操作将被撤消以再次具有单独的文档。
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)