MongoDB管道聚合各阶段示例

简介:

翻译自:blog.mongodb.org


下面我们就来看看几个操作符:


$match



$match的作用是过滤数据,通过设置一个条件,将数据进行筛选过滤,例子:

1
2
3
db.runCommand({ aggregate :  "article" , pipeline : [
{ $match : { author :  "dave"  } }
]});


这相当于将article这个collection中的记录进行筛选,筛选条件是author属性值为dave,其作用其实相当于普通的find命令,如:

1
> db.article.find({ author :  "dave"  });


所以,那这个命令有什么用呢?与find不同,find的结果是直接作为最终数据返回,而$match只是pipeline中的一环,它筛选的结果数据可以再进行下一级的统计操作。


$project


$project命令用于设定数据的筛选字段,就像我们SQL中select需要的字段一样。例子:

1
2
3
4
5
6
7
8
db.runCommand({ aggregate :  "article" , pipeline : [
{ $match : { author :  "dave"  } },
{ $project : {
_id : 0,
author : 1,
tags : 1
}}
]});


上面就是将所有author为dave的记录的author和tags两个字段取出来。(_id:0 表示去掉默认会返回的_id字段)


其实上面这个功能也能用我们平时用的find命令来实现,如:

1
> db.article.find({ author :  "dave"  }, { _id : 0, author : 1, tags : 1);


$unwind


$unwind命令很神奇,他可以将某一个为array类型字段的数据拆分成多条,每一条包含array中的一个属性。 

  
比如你使用下面命令添加一条记录:

1
2
3
4
5
6
7
8
9
10
11
12
db.article.save( {
title :  "this is your title"  ,
author :  "dave"  ,
posted : new  Date (4121381470000) ,
pageViews : 7 ,
tags : [  "fun"  ,  "nasty"  ] ,
comments : [
{ author : "barbara"  , text :  "this is interesting"  } ,
{ author : "jenny"  , text :  "i like to play pinball" , votes: 10 }
],
other : { bar : 14 }
});


这里面tags字段就是一个array。下面我们在这个字段上应用$unwind操作

1
2
3
db.runCommand({ aggregate :  "article" , pipeline : [
{ $unwind :  "$tags"  }
]});


上面命令的意思就是按tags字段来拆分,此命令执行的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{
"result"  : [
{
"_id"  : ObjectId( "4eeeb5fef09a7c9170df094b" ),
"title"  :  "this is your title" ,
"author"  :  "dave" ,
"posted"  : ISODate( "2100-08-08T04:11:10Z" ),
"pageViews"  : 7,
"tags"  :  "fun" ,
"comments"  : [
{
"author"  :  "barbara" ,
"text"  :  "this is interesting"
},
{
"author"  :  "jenny" ,
"text"  :  "i like to play pinball" ,
"votes"  : 10
}
],
"other"  : {
"bar"  : 14
}
},
{
"_id"  : ObjectId( "4eeeb5fef09a7c9170df094b" ),
"title"  :  "this is your title" ,
"author"  :  "dave" ,
"posted"  : ISODate( "2100-08-08T04:11:10Z" ),
"pageViews"  : 7,
"tags"  :  "nasty" ,
"comments"  : [
{
"author"  :  "barbara" ,
"text"  :  "this is interesting"
},
{
"author"  :  "jenny" ,
"text"  :  "i like to play pinball" ,
"votes"  : 10
}
],
"other"  : {
"bar"  : 14
}
}
],
"ok"  : 1
}


我们可以看到,原来的tags字段是一个包含两个元素的数组,通过$unwind命令后,被拆分成两条记录,每一条记录的tags字段是原来数组中的一个元素。


$group


$group命令比较好理解,功能就是按某一个key将key值相同的多条数据组织成一条。

  
比如我们使用下面命令再往article这个collection中写入一条记录,这时候我们就有两条记录了:

1
2
3
4
5
6
7
8
9
10
11
12
db.article.save( {
title :  "this is some other title"  ,
author :  "jane"  ,
posted : new  Date (978239834000) ,
pageViews : 6 ,
tags : [  "nasty"  ,  "filthy"  ] ,
comments : [
{ author : "will"  , text :  "i don't like the color"  } ,
{ author : "jenny"  , text :  "can i get that in green?"  }
],
other : { bar : 14 }
});


我们可以先用上面的$unwind按tags将记录拆成多条,然后再将记录按tags字段重新组织,将同一个tag对应的所有author放在一个array中。只需要像下面这样写:

1
2
3
4
5
6
7
8
db.runCommand({ aggregate :  "article" , pipeline : [
{ $unwind :  "$tags"  },
{ $ group  : {
_id :  "$tags" ,
count  : { $ sum  : 1 },
authors : { $addToSet :  "$author"  }
}}
]});


这时候你就能得到如下结果了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
{
"result"  : [
{
"_id"  :  "filthy" ,
"count"  : 1,
"authors"  : [
"jane"
]
},
{
"_id"  :  "fun" ,
"count"  : 1,
"authors"  : [
"dave"
]
},
{
"_id"  :  "nasty" ,
"count"  : 2,
"authors"  : [
"jane" ,
"dave"
]
}
],
"ok"  : 1
}


在易用性方面它们提供给我们很多便利,但是MongoDB MapReduce的最大硬伤,单个mongod中无法并行执行,貌似还是没有解决。虽然其命令中采用了pipeline 的组织模式,但是貌似还是完全串行且分降段完成的。

















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1661319 ,如需转载请自行联系原作者



相关文章
|
SQL NoSQL Unix
MongoDB聚合操作总结
这篇文章总结了MongoDB中聚合操作的作用、方法、常见聚合表达式以及聚合管道的概念和常用操作符,以及SQL与MongoDB聚合操作的对应关系。
1495 2
MongoDB聚合操作总结
|
SQL NoSQL Unix
MongoDB 聚合
10月更文挑战第17天
245 4
|
NoSQL MongoDB 数据库
python3操作MongoDB的crud以及聚合案例,代码可直接运行(python经典编程案例)
这篇文章提供了使用Python操作MongoDB数据库进行CRUD(创建、读取、更新、删除)操作的详细代码示例,以及如何执行聚合查询的案例。
624 6
|
JSON NoSQL MongoDB
MongoDB批量导出导入操作的示例
使用 `mongoexport`和 `mongoimport`工具可以方便地对MongoDB数据库进行批量数据的导出和导入操作。它们支持多种格式和灵活的选项,使得数据迁移、备份和同步变得简单快捷。在实际应用中,根据具体的需求和数据特性选择合适的命令和选项是非常重要的,这将确保数据处理的效率和准确性。
896 2
|
NoSQL 数据挖掘 数据处理
【MongoDB 专栏】MongoDB 聚合管道:数据分析利器
【5月更文挑战第10天】MongoDB的聚合管道是数据分析利器,它通过一系列阶段(如\$match、\$group、\$project等)处理和转换数据,实现过滤、分组、统计等功能。适用于复杂的数据分析任务,能高效处理大量数据并提供实时洞察。在电商、日志和金融等领域有广泛应用。注意索引优化和避免过度聚合,以确保准确性和效率。借助聚合管道,我们可以深入挖掘数据价值,驱动业务发展。
416 3
【MongoDB 专栏】MongoDB 聚合管道:数据分析利器
|
NoSQL BI 数据处理
【超实用攻略】MongoDB 聚合框架:从入门到精通,带你解锁数据处理新姿势!
【8月更文挑战第24天】MongoDB是一款以其灵活性和高性能闻名的NoSQL数据库。其强大的聚合框架采用管道式处理,允许用户定义多个数据处理阶段如过滤、分组等。本文通过示例数据库`orders`和`products`,演示如何利用聚合框架计算各产品的总销售额。示例代码展示了使用`$lookup`连接两集合、`$unwind`打平数组及`$group`按产品ID分组并计算总销售额的过程。这突显了聚合框架处理复杂查询的强大能力,是进行数据分析和报表生成的理想选择。
418 3
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
581 1
|
存储 NoSQL JavaScript
MongoDB存储过程实战:聚合框架、脚本、最佳实践,一文全掌握!
【8月更文挑战第24天】MongoDB是一款备受欢迎的文档型NoSQL数据库,以灵活的数据模型和强大功能著称。尽管其存储过程支持不如传统关系型数据库,本文深入探讨了MongoDB在此方面的最佳实践。包括利用聚合框架处理复杂业务逻辑、封装业务逻辑提高复用性、运用JavaScript脚本实现类似存储过程的功能以及考虑集成其他工具提升数据处理能力。通过示例代码展示如何创建订单处理集合并定义验证规则,虽未直接实现存储过程,但有效地演示了如何借助JavaScript脚本处理业务逻辑,为开发者提供更多实用指导。
456 2
|
存储 NoSQL 数据处理
【MongoDB大神级操作】揭秘聚合框架,让你的数据处理能力瞬间飙升,秒变数据界的超级英雄!
【8月更文挑战第24天】MongoDB是一款备受欢迎的非关系型数据库,以其灵活的文档模型和出色的可扩展性著称。其聚合框架尤其亮眼,能高效地对数据库中的数据执行复杂的转换与聚合操作,无需将数据导出到应用端处理,极大提升了数据处理的效率与灵活性。例如,在一个大型电商数据库中,聚合框架能轻松分析出最热卖的商品或特定时段内某类别商品的销售总额。通过一系列管道操作,如$unwind、$group等,可以对数据进行逐步处理并得到最终结果,同时还支持过滤、排序、分页等多种操作,极大地丰富了数据处理的能力,成为进行数据分析、报表生成及复杂业务逻辑实现的强大工具。
379 2
|
SQL NoSQL 数据处理
深入探索MongoDB的聚合操作
【10月更文挑战第13天】
562 0

推荐镜像

更多