aggregate聚合是通过管道操作实现的。聚合管道里的每一步输出,都会作为下一步的输入,每一步在输入文档执行完操作后生成输出文档。

聚合管道:

 $project 修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。对应project()方法

 $match 用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。对应match()

 $limit 用来限制MongoDB聚合管道返回的文档数。对应limit()方法

 $skip 在聚合管道中跳过指定数量的文档,并返回余下的文档。对应skip()

 $unwind 将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。对应unwind()方法

 $group 将集合中的文档分组,可用于统计结果。对应group()方法

 $sort 将输入文档排序后输出。对应sort()方法

 $geoNear 输出接近某一地理位置的有序文档。对应near()

$group表达式说明:

 $sum  计算总和

 $avg  计算平均值

 $min  获取每一组集合中所有文档对应值得最小值

 $max  获取每一组集合中所有文档对应值得最大值

 $push  在结果文档中插入值到一个数组中

 $addToSet  在结果文档中插入值到一个数组中,但不创建副本

 $first  根据资源文档的排序获取第一个文档数据

 $last  根据资源文档的排序获取最后一个文档数据

举例说明aggregate聚合 $group使用

商品属性:_id,  createTime,  nowPriceL,  nowPriceH,  number

统计每一天内店铺商品的最低价和最高价,平均最低价,

执行完$match管道后,得到的查询结果会输入到$project管道,执行完$project管道,得到的结果格式为{day,nowPriceL,nowPriceH},把这个结果输入$group管道,
$group管道执行完毕,输出的结果输入到$sort管道,$sort执行完毕,输出最终结果集
Goods.aggregate([
{
$match: {
number: {$gte:100} //匹配number>=100的记录
}
},
{
$project : {
day : {$substr: [{"$add":["$createTime", 28800000]}, 0, 10] },//时区数据校正,8小时换算成毫秒数为8*60*60*1000=288000后分割成YYYY-MM-DD日期格式便于分组
"nowPriceL": 1, //设置原有nowPriceL为1,表示结果显示原有字段nowPriceL
"nowPriceH":1, //设置原有nowPriceH为1,表示结果显示原有字段nowPriceH
avgNowPriceL:{$toDouble:"$nowPriceL"},//把最低价转换为小数
avgNowPriceH:{$toDouble:"$nowPriceH"},//把最高价转换为小数
"dayNumber":1 //每组内有多少个成员
},
}, {
$group: {
_id:"$day", //按照$day进行分组(一组为1天)
nowPriceL:{$min: "$nowPriceL"}, //查找组内最小的nowPriceL
nowPriceH:{$max: "$nowPriceH"}, //查找组内最大的nowPriceH
avgNowPriceL:{$avg:"$avgNowPriceL"},//统计每一天内店铺商品的平均最低价
avgNowPriceH:{$avg:"$avgNowPriceH"},//统计每一天内店铺商品的平均最高价
dayNumber:{$sum:1}
}
},
{
$sort: {
nowPriceL: 1//执行完 $group,得到的结果集按照nowPriceL升序排列
}
}]).exec(function (err, goods){
//返回结果
console.log(goods);
});
注意:
mongoodb存储的数据是按照世界时间存储的,因此进行分割操作时需要对时间进行时区校正,使用$add加上时区差8小时(毫秒数)才能得到正确的数据
$substr: [ <string>, <start>, <length> ] }
https://docs.mongodb.com/manual/reference/operator/aggregation/toDouble/#exp._S_toDouble
												

Mongoose: aggregate聚合 $group使用说明的更多相关文章

  1. aggregate聚合

    最近使用mongodb需要查询数据,用到了aggregate,学习下,上代码 db.表名.aggregate([ {$match:{'created_time':{$gte:'2016-01-15', ...

  2. MongoDB的aggregate聚合

    聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ...

  3. MongoDB中的数据聚合工具Aggregate和Group

    周煦辰 2016-01-16 来说说MongoDB中的数据聚合工具. Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直 ...

  4. Pandas的数据分组-aggregate聚合

    在对数据进行分组之后,可以对分组后的数据进行聚合处理统计. agg函数,agg的形参是一个函数会对分组后每列都应用这个函数. import pandas as pd import numpy as n ...

  5. node使用 mongoose聚合 group

    var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost:27017/test", fun ...

  6. MongoDB的分组统计 group

    mongodb中的分组聚合用$group,而且处理的最大数据量为100M如果超出需要写入到磁盘,使用格式如下: { $group: { _id: <expression>, <fie ...

  7. oracle having sum group by 详解

    Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...

  8. SQL sum和group by HAVING

    Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...

  9. MongoDB基础

    1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...

随机推荐

  1. CF1028C Rectangles 思维

     Rectangles time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  2. Dungeon Master POJ - 2251 [kuangbin带你飞]专题一 简单搜索

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  3. Go从入门到放弃

    Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...

  4. IDEA中全局搜索不起作用,解决办法

    众所周知IDEA中全局搜索的快捷键是Ctrl+Shift+F,但是今天却碰到了用不了的情况,其实软件坏了的可能性很小,那就要从外部再来找原因,查看自己开的软件,一一查看快捷键,看是否是快捷键冲突: 1 ...

  5. WPF 自定义UI控件学习

    最近项目中运用到了WPF处理三维软件,在C/S结构中WPF做UI还是有很多优越性,简单的学了一点WPF知识,成功的完成项目目标.项目过度阶段对于WPF的一些基本特点有了进一步了解 .至此花费一点时间研 ...

  6. 【第十七篇】easyui-datagrid 导出Excel (在客户端能弹出下载框)

    //导出Excel function exportExcel(obj) { var SaleOrderNo = $("#SaleOrderNo").val().trim(); va ...

  7. Docker入门到实践——简单操作

    1.对比传统虚拟机总结 特性 容器 虚拟机 启动 秒级 分钟级 硬盘使用 一般为MB 一般为GB 性能 接近原生 弱于 系统支持量 单机支持上千个容器 一般几十个 2.基本概念 Docker包括三个基 ...

  8. spring-boot集成spark并使用spark-sql

    首先添加相关依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  9. Hbase 日常运维

    日常维护的命令 1,major_compact 'testtable',通常生产环境会关闭自动major_compact(配置文件中hbase.hregion.majorcompaction设 为0) ...

  10. 前端 页面加载完成事件 - onload,五种写法

    在js和jquery使用中,经常使用到页面加载完成后执行某一方法.通过整理,大概是五种方式(其中有的只是书写方式不一样). 1:使用jQuery的$(function){}; 2:使用jquery的$ ...