MongoDB开发之 管道操作符
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB开发之 管道操作符相关的知识,希望对你有一定的参考价值。
参考技术A 获取MongoDB存储的数据,往往不是直接提取出来就可以使用的,需要对数据进行处理和分析后才可以使用。MongoDB提供了三种执行聚合的方式:聚合管道,map-reduce 函数和单一目的聚合方法。其中每个''标识一个阶段。
用于过滤数据,只输出符合条件的文档,SQL Example:
MongoDB Example:
将集合中的文档分组,可用于统计结果,SQL Example:
即将machineId进行分组后,对price进行求和。
修改输入文档的结构,限定结果集合,SQL Example:
MongoDB Example:
MongoDB Example:
MongoDB 聚合运算符还有很多,这里只对常用的做了简单的描述,具体的可以参照下表:
聚合管道操作有如:分组( project)、排序( count)等,每个操作在管道中叫做阶段(stage),每个阶段执行的结果会给下一个阶段。
如图:
../images/map-reduce.bakedsvg.svg
其类似Linux中的管道操作:
分四步:
上面示例分为三步:
查询结果为:
MongoDB Documentation aggregation
MongoDB权威指南
MongoDB——聚合管道之$group操作
目录
一、聚合管道之$group的概述
- 按指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一个阶段。输出文档包含一个_id字段,该字段按键包含不同的组。
- 输出文档还可以包含计算字段,该字段保存由$ group的_id字段分组的一些accumulator表达式的值。$ group不会输出具体的文档而只是统计信息。
二、聚合管道之$group的语法
-
$group的语法格式
$group: _id: <expression>, <field1>: <accumulator1> : <expression1> , ...
-
语法格式的解释
(1)、_id字段是必填的;但是可以指定id值为null来为整个输入文档计算累计值。
(2)、剩余的计算字段是可选的,并使用< accumulator>运算符进行计算。
(3)、_id和< accumulator>表达式可以接受任何有效的表达式。
三、accumulator操作符
名称 | 描述 | 类比sql |
---|---|---|
$avg | 计算均值 | avg |
$first | 返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的第一个文档。 | limit0,1 |
$last | 返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的最后个文档。 | - |
$max | 根据分组,获取集合中所有文档对应值得最大值。 | max |
$min | 根据分组,获取集合中所有文档对应值得最小值。 | min |
$push | 将指定的表达式的值添加到一个数组中。 | - |
$addToSet | 将表达式的值添加到一个集合中(无重复值,无序)。 | - |
$sum | 计算总和 | sum |
$stdDevPop | 返回输入值的总体标准偏差(population standard deviation) | - |
$stdDevSamp | 返回输入值的样本标准偏差(the sample standard deviation) | - |
- 注:$ group阶段的内存限制为100M。默认情况下,如果stage超过此限制,$ group将产生错误。但是,要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$group操作以写入临时文件。
四、聚合管道之$group的示例
4.1、数据准备
-
准备数据集,执行脚本
var tags = ["nosql","mongodb","document","developer","popular"]; var types = ["technology","sociality","travel","novel","literature"]; var books=[]; for(var i=0;i<50;i++) var typeIdx = Math.floor(Math.random()*types.length); var tagIdx = Math.floor(Math.random()*tags.length); var tagIdx2 = Math.floor(Math.random()*tags.length); var favCount = Math.floor(Math.random()*100); var username = "xx00"+Math.floor(Math.random()*10); var age = 20 + Math.floor(Math.random()*15); var book = title: "book-"+i, type: types[typeIdx], tag: [tags[tagIdx],tags[tagIdx2]], favCount: favCount, author: name:username,age:age ; books.push(book) db.books1.insertMany(books);
-
查询books1集合中的数据
> db.books1.find()
4.2、统计books1集合中的数量、收藏总数和平均值
-
统计book的数量、收藏总数和平均值
db.books1.aggregate([ $group:_id:null,count:$sum:1,popCount:$sum:"$favCount",avgValue: $avg:"$favCount" ])
-
解释
4.3、统计books1集合中每个作者的book收藏总数
-
统计每个作者的book收藏总数
db.books1.aggregate([ $group:_id:"$author.name",pop:$sum:"$favCount" ])
-
解释
4.4、统计books1集合中每个作者的每本book的收藏数
-
统计每个作者的每本book的收藏数
db.books1.aggregate([ $group:_id:name:"$author.name",title:"$title",pop:$sum:"$favCount" ])
-
解释
4.5、统计books1集合中每个作者的book的type合集
-
统计每个作者的book的type合集
db.books1.aggregate([ $group:_id:"$author.name",types:$addToSet:"$type" ])
-
解释
以上是关于MongoDB开发之 管道操作符的主要内容,如果未能解决你的问题,请参考以下文章