MongoDB - 聚合数据

MongoDB - 聚合数据 首页 / MongoDB入门教程 / MongoDB - 聚合数据

聚合操作处理数据记录并返回计算输出,聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个输出。在SQL中,count(*)和group by等效于mongodb聚合。

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

Aggregation - 语法

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

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

Aggregation - 示例

在集合中,您具有以下数据-

{
   _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的先前值都会增加。以下是可用的聚合表达式的列表。

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

Pipeline 概念

在UNIX命令中,管道意味着可以对某些输入执行操作,并将输出用作下一条命令的输入,依此类推, MongoDB在聚合框架中也支持相同的概念。有一组可能的阶段,每个阶段都作为一组文档作为输入,并生成一组输出文档,然后可以将其用于下一阶段,依此类推。

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

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

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

  • $group      - 这是如上所述的实际汇总。

  • $sort         - 对文档进行排序。

  • $skip         - 这样,就可以在给定数量的文档中向前跳过文档列表。

  • $limit        - 从当前位置开始,以给定的编号限制要查看的文档数量。

  • $unwind   - 用于展开使用数组的文档,当使用数组时,数据是一种预连接的,并且此操作将被撤消以再次具有单独的文档。

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

白话法律42讲 -〔周甲徳〕

数据中台实战课 -〔郭忆〕

正则表达式入门课 -〔涂伟忠〕

如何看懂一幅画 -〔罗桂霞〕

爱上跑步 -〔钱亮〕

说透数字化转型 -〔付晓岩〕

Kubernetes入门实战课 -〔罗剑锋〕

B端体验设计入门课 -〔林远宏(汤圆)〕

结构思考力 · 透过结构看表达 -〔李忠秋〕

好记忆不如烂笔头。留下您的足迹吧 :)