最近使用mongodb需要查询数据,用到了aggregate,学习下,上代码

db.表名.aggregate([
{$match:{'created_time':{$gte:'2016-01-15',$lte:'2019-01-20'},'token':{'$ne':null}}}
,{$group:{"_id":{"lm_number":"$lm_number","source_type":"$source_type","app":"$app","position":"$position","created_time":"$created_time","token":"$token"}}}
,{$group:{"_id":{"lm_number":"$_id.lm_number","source_type":"$_id.source_type","app":"$_id.app","created_time":"$_id.created_time","position":"$_id.position"}, "COUNT(token)" : {"$sum" : NumberInt(1)}}}
,{$project:{"_id": 0,"lm_number":"$_id.lm_number","created_time":"$_id.created_time","source_type":"$_id.source_type","app":"$_id.app","position":"$_id.position","COUNT(token)":"$COUNT(token)"}}
,{$sort:{"created_time":-1}
,{$skip:0}
,{$limit:1}
,{$unwind: {path: '$created_time',preserveNullAndEmptyArrays: true}}
]);

  对应的目标数据结构

{
"_id" : ObjectId("5c469ad680499b3d42558c1b"),
"event_id" : "1002106",
"is_login" : "0",
"event_time" : "1548131024375",
"device_id" : "5c469ab9879842003a2dca3d",
"token" : "A4pudYt6COzQ-f2mSVAriPaloRGKKqKg",
"mobile" : "",
"version_code" : "10100",
"source_type" : "client",
"os" : "android",
"app" : "ep",
"channel" : "autoupdate",
"utm_source" : "",
"created_time" : "2019-01-18 12:23:50"
}
{
"_id" : ObjectId("5c469b5f526159282e5daabf"),
"ad_id" : "3",
"event_id" : "1002107",
"is_login" : "1",
"position" : "1",
"lm_number" : "2018122614102766196661",
"event_time" : "1548131161304",
"device_id" : "5c469b53879842003a2dd0f1",
"token" : "A4pudYt6COzQ-f2mSVAriPaloRGKKqKg",
"mobile" : "13894101298",
"version_code" : "10100",
"source_type" : "client",
"os" : "android",
"app" : "ep",
"channel" : "autoupdate",
"utm_source" : "aaa",
"created_time" : "2019-01-16 12:26:07",
"user_id" : "258"
}

  #$match:过滤,按条件筛选。$gte大于等于,$lte小于等于,$gt大于,$lt小于
  #$group:分组聚合。$sum计算总和,{$sum: 1}表示返回总和×1的值(即总和的数量),使用{$sum: '$制定字段'}也能直接获取制定字段的值的总和
  #$project:投射,从聚合的子文档中提取字段供显示,也可重命名(注意显示的字段必须要在子文档中存在);其中的"_id"为0则不显示其值,反之为1显示
  #$sort:排序,-1为desc降序,1位asc正序
  #skip:跳过指定数量条数,默认0。类似mysql的limit的第一个参数
  #limit:限制读取的条数。类似mysql的limit的第二个参数
  #unwind:对其中指定的数组类型进行拆分,最终每条信息中包含数组的一个值。还可以写成{$unwind:'$created_time'},其中的$created_time是数据中的一个字段,此字段可以为空数组、非数组、null、字符串。数组会拆分如上述所讲,其他值若不设置会丢失(除字符串)。所以就需要使用preserveNullAndEmptyArrays的写法,其值为true既保留空数组等;path为指定的字段。

  ###注意,这里连续使用了两个group,第一个$group为多条件分组聚合,第二个为多重分组聚合
  ###用mysql的思想就是

select lm_number,source_type,app,position,count(token) from (

	select
lm_number
,source_type
,app
,position
,token
from 表名
group by lm_number,source_type,app,position,token ) as t group by lm_number,source_type,app,position;

  ###第一个相当于上述的子查询那部分,第二个就是外面的那部分。在很多聚合后还会有重复的场景中就可以使用多重聚合。

  ###多重聚合取总数:
  ##多个条件时:

db.表名.aggregate([
{$group:{"_id":{"lm_number":"$_id.lm_number","source_type":"$_id.source_type","app":"$_id.app","created_time":"$_id.created_time","position":"$_id.position"}, "COUNT(token)" : {"$sum" : NumberInt(1)}}}
]);

  ##单个条件时:

db.表名.aggregate([
{$group:{"_id":"lm_number", "count" : {"$sum" : NumberInt(1)}}}
]);

  学习学习学习...

aggregate聚合的更多相关文章

  1. MongoDB学习day06--高级查询aggregate聚合管道和nodejs操作aggregate

    一.MongoDB聚合管道(Aggregation Pilpeline) 使用聚合管道可以对集合中的文档进行变换和组合. 主要功能:表的关联查询.数据统计 二.aggregate 管道操作符与表达式 ...

  2. Mongoose: aggregate聚合 $group使用说明

    aggregate聚合是通过管道操作实现的.聚合管道里的每一步输出,都会作为下一步的输入,每一步在输入文档执行完操作后生成输出文档. 聚合管道:  $project 修改输入文档的结构.可以用来重命名 ...

  3. MongoDB的aggregate聚合

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

  4. mongoTemplate.aggregate()聚合查询

    一.概述 1. 聚合的表达式 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 下表展示了一些聚 ...

  5. mongdb aggregate 聚合数据

    最近用到的一些mongodb的数据查询方法 及api用法 Aggregate() 数据聚合处理的方法 可以将聚合的一些方法放在其后面的括号中,也可继续以agg.的样式链式加入 aggregate.al ...

  6. mongodb aggregate 聚合 操作(扁平化flatten)

    mongodb自带的函数非常多,最近用mongo做持久化数据库,遇到一个需求:子文档是个数组,把数组里的各个字段扁平化合到根文档中,查过资料后(主要是mongodb的文档和stackoverflow) ...

  7. mongdb aggregate聚合操作

    1.数据准备 查看前一篇group操作 2.aggregate函数参数讲解 mysql mongdb===================WHERE --->$match GROUP BY -- ...

  8. Aggregate 聚合用法

    var listb= ListA.Where(x => x.Id.Equals(obj.Id)).Select(x => x.SubData).Aggregate((x, y) => ...

  9. Mongodb - 解决 ( aggregate聚合管道 ) $match 根据 id 匹配 返回 [ ] 的问题

    需要对 id 进行转换 const mongoose = require('mongoose') var ObjectId = mongoose.Types.ObjectId;   await Use ...

随机推荐

  1. Xamarin 简化的Android密钥库签名

    安装 开始使用这个新工具不容易.在Visual Studio 2017(即将推出VS 2015),只需转到工具 - >扩展和更新,并搜索“密钥库”来查找扩展名. 下载后,只需重新启动Visual ...

  2. Spring注解与Java元注解小结

    注解 Annotation 基于注解的开发,使得代码简洁,可读性高,简化的配置的同时也提高了开发的效率,尤其是SpringBoot的兴起,随着起步依赖和自动配置的完善,更是将基于注解的开发推到了新的高 ...

  3. MySQL 同一台服务器同步数据

    声明:我配置出来的slave_io_running和slave_sql_running都是yes.但是数据并没有同步! 希望有遇到相同问题的朋友,能够告诉我一下解决方案? 首先,如何在同一个服务器安装 ...

  4. UOJ274 [清华集训2016] 温暖会指引我们前行 【LCT】【最大生成树】

    题目分析: 差评,最大生成树裸题.hack数据还卡常. 代码: #include<bits/stdc++.h> using namespace std; ; struct LCT{ ],d ...

  5. 洛谷P2858奶牛零食 题解

    题目 这个题一开始能看出来是一道动态规划的题目,但是并不知道如何写状态转移方程,但是我们可以想一想这个题应该是一道区间DP,而区间DP的特点就是状态转移方程一般跟该区间的左节点和右节点或者中间断点有关 ...

  6. Web页面执行shell命令

    本文以apache为web服务器为例 安装apache服务yum -y install httpd 启动apachesystemctl restart httpd 创建shell脚本cd /var/w ...

  7. 【java+selenium】网易云音乐刷累计听歌数

    背景应该是在去年的时候,刷知乎看到一个问题,大概是说怎么刷网易云音乐个人累计听歌数,然后有一个高赞回答,贴了一段js代码,直接在浏览器console执行就可以了.当时试了下,直接一下子刷了有好几万.悲 ...

  8. 子网站不继承父的WEBCONFIG

    环境 W10 IIS10  / WIN2012 IIS上以前有一个网站,后来写了一个接口项目,需要当成WEB应用程序挂到这网站下. 在右击添加应用程序,指向接口项目后.发现访问不了接口项目.死活配置有 ...

  9. shell中,2>&1详解

    我们在Linux下经常会碰到nohup command>/dev/null 2>&1 &这样形式的命令.首先我们把这条命令大概分解下,首先就是一个nohup表示当前用户和系 ...

  10. luogu1397 [NOI2013]矩阵游戏 (等比数列求和)

    一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...