Mongoose: aggregate聚合 $group使用说明
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使用说明的更多相关文章
- aggregate聚合
最近使用mongodb需要查询数据,用到了aggregate,学习下,上代码 db.表名.aggregate([ {$match:{'created_time':{$gte:'2016-01-15', ...
- MongoDB的aggregate聚合
聚合框架中常用的几个操作: $project:修改输入文档的结构.可以用来重命名.增加或删除域,也可以用于创建计算结果以及嵌套文档.(显示的列,相当遇sql 的) $match:用于过滤数据,只输出符 ...
- MongoDB中的数据聚合工具Aggregate和Group
周煦辰 2016-01-16 来说说MongoDB中的数据聚合工具. Aggregate是MongoDB提供的众多工具中的比较重要的一个,类似于SQL语句中的GROUP BY.聚合工具可以让开发人员直 ...
- Pandas的数据分组-aggregate聚合
在对数据进行分组之后,可以对分组后的数据进行聚合处理统计. agg函数,agg的形参是一个函数会对分组后每列都应用这个函数. import pandas as pd import numpy as n ...
- node使用 mongoose聚合 group
var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost:27017/test", fun ...
- MongoDB的分组统计 group
mongodb中的分组聚合用$group,而且处理的最大数据量为100M如果超出需要写入到磁盘,使用格式如下: { $group: { _id: <expression>, <fie ...
- oracle having sum group by 详解
Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...
- SQL sum和group by HAVING
Aggregate functions (like SUM) often need an added GROUP BY functionality. 集合函数(类似SUM)经常需要用GROUP BY来 ...
- MongoDB基础
1.概念及特点 说明:由于部分语句中$ 符号无法正常显示,使用¥代表 概念 MongoDB是一个基于文档的分布式的开源的NoSQL数据库,文档的结构为BSON形式,每一个文档都有一个唯一的Object ...
随机推荐
- 2018中国大学生程序设计竞赛 - 网络选拔赛 hdu Find Integer 数论
Find Integer Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tota ...
- CodeForces Educational Codeforces Round 51 (Rated for Div. 2)
A:Vasya And Password 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen(&q ...
- Excel如何动态获取列名
遇到一个动态列,N行数据的求和,但是求和时需要Excel列名(A,B,C...)当时觉得这太非常难了.后来仔细研究了下Excel列名,都是从A到Z,然后AA再到AZ,以此类推. 如此的话就好弄了.通过 ...
- 关于BFC的一些事
BFC的生成 在实现CSS的布局时,假设我们不知道BFC的话,很多地方我们生成了BFC但是不知道.在布局中,一个元素是block元素还是inline元素是必须要知道的.而BFC就是用来格式化块状元素盒 ...
- eclipse中注释模板使用
步骤: Window -->Preferences-->Java-->Code Style -->Code Templates-->Comments 1.Files可对整 ...
- Spring boot 集成 Druid 数据源
Druid是阿里开源的一个JDBC应用组件,其中包括三部分: DruidDriver:代理Driver,能够提供基于Filter-Chain模式的插件体系. DruidDataSource:高效可管理 ...
- MongoDB入门及 c# .netcore客户端MongoDB.Driver使用
MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...
- 正确应用Java数组
一.数组的特点 数组与其他容器的区别有三方面:效率.类型和保存基本类型的能力. 1.效率.数组是一种效率最高的存储和随机访问对象引用序列的方式.数组是一段连续地址空间内的线性序列,所以访问非常快.但也 ...
- android 端缓存清理的实现
首先关于缓存清理,网上已经有太多的工具类,但是遗憾的是,基本上都不完善,或者说根本就不能用,而项目中又要求实现这个烂东西(其实这玩意真没一点屁用,毕竟第三方清理/杀毒软件都带这么一个功能),但是只好硬 ...
- java读取Excel —— XSSFWorkbook 找不到该类