MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)
MongoDB聚合管道
使用聚合管道可以对集合中的文档进行变换和组合。
管道是由一个个功能节点组成的,这些节点用管道操作符来进行表示。聚合管道以一个集合中的所有文档作为开始,然后这些文档从一个操作节点流向下一个节点
,每个操作节点对文档做相应的操作。这些操作可能会创建新的文档或者过滤掉一些不符合条件的文档,在管道中可以对文档进行重复操作。
管道表达式只可以操作当前管道中的文档,不能访问其他的文档:表达式操作可以在内存中完成对文档的转换。
语法格式:
db.runCommand({
aggregate: "<collection>",
pipeline: [ <stage>, <...> ],
explain: <boolean>,
allowDiskUse: <boolean>,
cursor: <document>,
bypassDocumentValidation: <boolean>
})
//或
db.collection.aggregate([ <pipeline>, <...> ], options)
参数说明:
|
操作符 |
描述 |
|
aggregate |
要聚合的集合名称 |
|
pipeline |
管道操作符 |
|
explain |
返回指定aggregate各个阶段管道的执行计划信息 |
|
allowDiskUse |
每个阶段管道限制为100MB的内存,如果大于100MB的数据可以先写入临时文件。设置为true时,aggregate操作可时可以先将数据写入对应数据目录的子目录中 |
|
cursor |
指定游标的初始批批大小。光标的字段的值是一个与场batchSize文件。 } |
|
bypassDocumentValidation |
只有当你指定了$out操作符,使db.collection.aggregate绕过文档验证操作过程中。这让您插入不符合验证要求的文档。 |
管道操作符:
|
管道操作符 |
描述 |
|
$project |
数据投影,主要用于重命名、增加和删除字段 |
|
$match |
过滤操作,筛选符合条件文档,作为下一阶段的输入 $match的语法和查询表达式db.collection.find() 的语法相同 |
|
$limit |
限制经过管道的文档数量 $limit的参数只能是一个正整数 |
|
$skip |
从待操作集合开始的位置跳过文档的数目 $skip参数也只能为一个正整数 |
|
$unwind |
将数组分解为单个的元素,并与文档的其余部分一同返回 |
|
$group |
可以将文档依据指定字段的不同值进行分组,如果选定了需要进行分组的字段,就可以将指定的字段传递给$group函数的_id字段 |
|
$sort |
对文档按照指定字段排序 |
|
$geoNear |
会返回一些坐标值,这些值以按照距离指定点距离由近到远进行排序 |
|
$sample |
从待操作的集合中随机返回指定数量的文档 |
|
$lookup |
用于与统一数据库中其他集合之间进行join操作 |
|
$out |
用户将聚合的结果输出到指定的集合,如果要使用$out则必须在整个管道操作的最后阶段 |
|
$redact |
字段所处的document结构的级别. $redact还有三个重要的参数: 1)$$DESCEND: |
聚合管道操作实例
提取字段
db.order.aggregate({ $project: { cust_id: 1, price: 1 } });
db.order.aggregate({ $project: { items: 1, items: { sku: 1 } } });
重命名字段
db.order.aggregate({ $project: { "orderid": '$_id', _id: 0, "custid": '$cust_id' } });
db.order.aggregate({ $project: { items: { '_sku': '$sku', sku: 1 } } })
新建文档
db.order.aggregate({
$project: {
price: 1,
details: { price: '$items.price' }
}
});
注意:由于对字段进行重命名时,MongoDB并不会记录字段的历史名称,所以如果针对原来的字段创建过索引,那么聚合管道在进行排序时无法在下面的排序操作时使用索引,
应当尽量在修改字段名称之前使用排序
db.order.aggregate([{ $project: { "orderid": '$_id', _id: 0, "custid": '$cust_id' } }, { $sort: { custid: -1 } }])
//建议写法
db.order.aggregate([{ $sort: { cust_id: -1 } }, { $project: { "orderid": '$_id', _id: 0, "custid": '$cust_id' } }])
{ $add: [ <expression1>, <expression2>, ... ] } 将多个数字或日期进行相加,只支持数字和时间格式,如果其中一个参数是日期,$add会将其他参数视为要添加到日期的毫秒
db.order.aggregate({
$project: {
"add": {
"$add": ["$price", 1]
}
}
})
{ $subtract: [ <expression1>, <expression2> ] } 接受两个表达式作为参数,使用第一个表达式减去第二个表达式作为结果
db.order.aggregate({
$project: {
"subtract": {
"$subtract": [{ "$add": ["$price", 12] }, 10]
}
}
})
{ $multiply: [ <expression1>, <expression2>, ... ] } 接受一个或多个表达式,并将它们相乘
db.order.aggregate({
$project: {
"multiply": { "$multiply": ["$price", 3] }
}
})
{ $divide: [ <expression1>, <expression2> ] } 接受两个表达式作为参数,使用第一个表达式除以第二个表达式的商作为结果
db.order.aggregate({
$project: {
"divide": { "$divide": ["$price", 3] }
}
})
更多数学表达式参考官方文档 https://docs.mongodb.com/manual/reference/operator/aggregation-arithmetic/
{ $cond: { if: <boolean-expression>, then: <true-case>, else: <false-case-> } } 或{ $cond: [ <boolean-expression>, <true-case>, <false-case> ] } 如果boolean-expression为true则执行true-case否则执行false-case
db.order.aggregate({
$project: {
"price": {
"$cond": { if: { $gt: ["$price", 25] }, then: true, else: false }
}
}
});
//或
db.order.aggregate({
$project: {
"price": {
"$cond": [{ $gt: ["$price", 25] }, true, false]
}
}
});
{ $ifNull: [ , ] } 如果expression 为 null 则返回replacement-expression-if-null 否则返回expression的值
db.order.aggregate({
$project: {
"total": {
"$ifNull": ["$total", 0]
}
}
})
{ $and: [ <expression1>, <expression2>, ... ] } 如果所有表达式都返回true,则结果为true,否则为false 除了布尔类型false,以下几种类型也为false,如:null,0,undefined ;其它值则为true,包括非0的值及数组
//Example Result
{ $and: [1, "green"] } true
{ $and: [] } true
{ $and: [[null], [false], [0]] } true
{ $and: [null, true] } false
{ $and: [0, true] } false
{ $or: [ <expression1>, <expression2>, ... ] } 只要有任意表达式为true,则结果为true,否则为false 除了布尔类型false,以下几种类型也为false,如:null,0,undefined ;其它值则为true,包括非0的值及数组
//Example Result
{ $or: [ true, false ] } true
{ $or: [ [ false ], false ] } true
{ $or: [ null, 0, undefined ] } false
{ $or: [] } false
{ $not: [ <expression> ] } 对expression取反
除了布尔类型false,以下几种类型也为false,如:null,0,undefined ;其它值则为true,包括非0的值及数组
//total不存在为false,取反结果则为true
db.order.aggregate({
$project: {
not: {
$not: "$total"
}
}
})
$match 过滤操作,筛选符合条件文档,作为下一阶段的输入 $match的语法和查询表达式db.collection.find() 的语法相同
db.order.aggregate([{ $match: { cust_id: "1" } }, {
$project: {
"total": {
"$ifNull": ["$total", 0]
}
}
}])
$out 用户将聚合的结果输出到指定的集合
db.order.aggregate([{ $match: { cust_id: "1" } }, {
$project: {
"total": {
"$ifNull": ["$total", 0]
}
}
},
{ $out: "testaggregate" }])
$unwind 将数组分解为单个的元素,并与文档的其余部分一同返回
db.order.aggregate({$unwind:"$items"})
$group 对数据进行分组 $group的时候必须要指定一个_id域,同时也可以包含一些算术类型的表达式操作符
db.order.aggregate([
{
$unwind: "$items"
},
{
$group: {
_id: "$cust_id",
qty: {
$sum: "$items.qty"
}
}
}
])
关系型数据库与MongoDB关于聚合的一些对比
|
关系型数据库 |
Mongodb |
|
WHERE |
|
|
GROUP BY |
|
|
HAVING |
|
|
SELECT |
|
|
ORDER BY |
|
|
LIMIT |
|
|
SUM() |
|
|
COUNT() |
|
|
join |
MongoDB学习笔记——聚合操作之聚合管道(Aggregation Pipeline)的更多相关文章
- MongoDB学习笔记:Python 操作MongoDB
MongoDB学习笔记:Python 操作MongoDB Pymongo 安装 安装pymongopip install pymongoPyMongo是驱动程序,使python程序能够使用Mong ...
- MongoDB学习笔记(11) --- 聚合
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) aggregate() 方法 MongoDB中聚 ...
- MongoDB学习笔记(数据操作)
1. 批量插入: 以数组的方式一次插入多个文档可以在单次TCP请求中完成,避免了多次请求中的额外开销.就数据传输量而言,批量插入的数据中仅包含一份消息头,而多次单条插入则会在每次插入数据时封 ...
- MongoDB学习笔记——数据库操作
使用use数据库名称来创建数据库,如果该数据库已经存在则返回这个数据库 语句格式:use DATABASE_NAME >use mynewdb switched to db mynewdb 使用 ...
- MongoDB 学习笔记(python操作)
转自: http://blog.csdn.net/daillo/article/details/7030910
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- 【转】mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
mongoDB 学习笔记纯干货(mongoose.增删改查.聚合.索引.连接.备份与恢复.监控等等) http://www.cnblogs.com/bxm0927/p/7159556.html
- MongoDB学习笔记(三、MongoDB聚合与更新)
目录: 聚合 更新 更新选择器 ObjectId 更新操作的原子性 聚合: 聚合语法:db.collectionName.aggregate(aggregate_operation) 聚合操作其实就是 ...
- MongoDB学习笔记,基础+增删改查+索引+聚合...
一 基础了解 对应关系 -> https://docs.mongodb.com/manual/reference/sql-comparison/ database -> database ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
随机推荐
- HT图形组件设计之道(一)
HT for Web简称HT提供了涵盖通用组件.2D拓扑图形组件以及3D引擎的一站式解决方案,正如Hightopo官网所表达的我们希望提供:Everything you need to create ...
- SQL 表变量和临时表
SQL 表变量和临时表 表变量:存储在内存中,作用域是脚本的执行过程中,脚本执行完毕之后就会释放内存,适合短时间内存储数据量小的数据集. 优点:使用灵活,使用完之后立即释放,不占用物理存储空间 缺点: ...
- 《深入理解Java集合框架》系列文章
Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...
- Spring MVC的web.xml配置详解(转)
出处http://blog.csdn.net/u010796790 1.spring 框架解决字符串编码问题:过滤器 CharacterEncodingFilter(filter-name) 2.在w ...
- Python 3.x自定义迭代器对象
Python 3.x与Python 2.x之间存在着较多的语法细节差异.今天在看Python核心编程的时候,说到了自定义迭代器对象.于是动手将源码打了一遍,原书代码如下: class AnyIter( ...
- 非链接方式访问数据库--查询的数据集用Dataset来存储。
private void Button_Click_1(object sender, RoutedEventArgs e) { //非链接方式访问数据库, //1创建连接对象(连接字符串) using ...
- 重构第28 天 重命名bool方法(Rename boolean method)
详解:本文中的”为布尔方法命名”是指如果一个方法带有大量的bool 参数时,可以根据bool 参数的数量,提取出若干个独立的方法来简化参数. 理解: 我们现在要说的重构并不是普通字面意义上的重构,它有 ...
- 重构第16天 封装条件(Encapsulate Conditional)
理解:本文中的“封装条件”是指条件关系比较复杂时,代码的可读性会比较差,所以这时我们应当根据条件表达式是否需要参数将条件表达式提取成可读性更好的属性或者方法,如果条件表达式不需要参数则可以提取成属性, ...
- Google的分布式关系型数据库F1和Spanner
F1是Google开发的分布式关系型数据库,主要服务于Google的广告系统.Google的广告系统以前使用MySQL,广告系统的用户经常需要使用复杂的query和join操作,这就需要设计shard ...
- css样式表和选择器的优先级以及position元素属性值的区别
css样式表优先级 问题:当同一个HTML元素被不止一个样式定义时,会使用哪个样式呢? 答:一般而言,所有的样式会根据下面的规则层叠于一个新的虚拟样式表中,其中数字4拥有最高的优先权. 1.浏览器缺省 ...