MongoDB三种分组方式
  1. group(先筛选再分组,不支持分片,对数据量有所限制,效率不高) 【简单分组实测150W 12.5s】
  2. mapreduce(基于js引擎,单线程执行,效率较低,适合用做后台统计等) 【简单分组实测150W 28.5s】
  3. aggregate(推荐) (性能要高很多,并且使用上要简单些) 【简单分组实测150W 2.6s】

group
db.ad_play_log.group({
// https://docs.mongodb.org/manual/reference/method/db.collection.group/
// https://docs.mongodb.org/manual/reference/command/group/#dbcmd.group
key: {
// 分组的字段
ad_position_id: 1
},
cond: {
// WHERE条件
ord_dt: {
$gt: new Date('01/01/2012')
}
},
reduce: function (curr, result) {
result.count++;
},
initial: {
count: 0
}
});

// SELECT ad_play_log, SUM(material_id) as total
// FROM orders
// WHERE ord_dt > '01/01/2012'
// GROUP BY ad_position_id


MapReduce

db.runCommand({
mapreduce: "ad_play_log",
map: function Map() {
var key = {
ad_position_id: this.ad_position_id
};
var value = {
count: 1
};

/**
* key value 传给reduce函数处理
;
}
return ret;
},
out: {
inline: 1
}
});
Mongodb官网对MapReduce介绍:
Map/reduce in MongoDB is useful for batch processing of data and aggregation operations. It is similar in spirit to using something like Hadoop with all input coming from a collection and output going to a collection. Often, in a situation where you would
have used GROUP BY in SQL, map/reduce is the right tool in MongoDB.

大致意思是:Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作,有点类似于使用Hadoop对集合数据进行处理,所有输入数据都是从集合中获取,而MapReduce后输出的数据也都会写入到集合中。通常类似于我们在SQL中使用Group By语句一样。
 
使用MapReduce要实现两个函数:Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。

Aggregate

db.ad_play_log.aggregate(
{
}}
}
// == SELECT ad_position_id,count(1) AS count FROM ad_play_log GROUP BY ad_position_id
);

Java代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
public void test_aggregate() {
        MongoCollection<Document> collection = MongoUtil.getCollection("ad_play_log");
        AggregateIterable<Document> iterable = collection.aggregate(asList(new Document("$group",
                new Document("_id""$ad_position_id").append("count"new Document("$sum"1)))));
        iterable.forEach(new Block<Document>() {
            @Override
            public void apply(final Document document) {
                System.out.println(document.toJson());
            }
        });
    }

统计aggregate的行数

  1. Use $project to
    save tag and count into tmp
  2. Use $push or addToSet to
    store tmp into your data list.

Code:

}, data:{$addToSet:'$tmp'}}})

Output:

}


MongoDB分组的更多相关文章

  1. MongoDB分组汇总操作,及Spring data mongo的实现

    转载请在页首注明作者与出处 一:分组汇总 1.1:SQL样例 分组汇总的应用场景非常多,比如查询每个班级的总分是多少,如果用关系形数据库,那么sql是这样子的 ),class from score g ...

  2. mongodb 分组查询

    数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept' ...

  3. mongodb分组,的两种方式,先记一下

    using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; using NationalUnion.AdGalle ...

  4. C# 操作mongodb 分组

    c#操作mongodb的分组的简单例子: 1.首先要下载c#对应的mongodb驱动,官方下载地址:https://github.com/mongodb/mongo-csharp-driver/rel ...

  5. MongoDB,分组,聚合

    使用聚合,db.集合名.aggregate- 而不是find 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数.MongoDB的聚合管道将MongoDB文档在一个管道处理完 ...

  6. MongoDB分组查询,聚合查询,以及复杂查询

    准备数据 from pymongo import MongoClient import datetime client=MongoClient('mongodb://localhost:27017') ...

  7. mongodb分组排序

    @Override public MessageDto getCheckInMembersByFlight(String fltDt, String fltNr, String channel,Str ...

  8. mongodb分组函数的使用(spring-data-mongodb)

    这两天要做mongodb日志的模块,下面记录一下. 一. 首先要导入一批数据,使用springboot来完成. 配置mongodb的复制集:在application.yml文件中配置uri来完成 格式 ...

  9. mongoDB 分组并对分组结果筛选类似于SQL中的(group by xxx having ) 附带Java代码

    今天需要做一个筛选程序,因为数据放在mongodb中,没写过分组的查询语句,查了一些资料,终于写出来了,分享给各位小伙伴 需求是 查询 学员 在2019-07-29之后未同步的数据(同一个学员需要2条 ...

随机推荐

  1. vim基本操作

    Vim 是 Linux 系统上的最著名的文本/代码编辑器,也是早年的 Vi 编辑器的加强版,而 gVim 则是其 Windows 版.它的最大特色是完全使用键盘命令进行编辑,脱离了鼠标操作虽然使得入门 ...

  2. LINUX逻辑卷(LVM)管理与逻辑卷分区

    LINUX之逻辑卷管理与逻辑卷扩展 LVM是逻辑卷管理(Logical Volume Manager)的简称,他是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,和直接使用物理存储在管理上相 ...

  3. Java网络爬虫Hello world实现——Httpclient爬取百度首页

    1.创建Maven项目 2.Httpclient Maven地址 <dependency> <groupId>org.apache.httpcomponents</gro ...

  4. 移动端meta标签缓存设置

    1.<meta charset="utf-8"> 2.<meta content="width=device-width, initial-scale= ...

  5. discuz全新安装升级,导入旧数据过程,顺便gbk转utf8

    由于discuz官方已经不更新了,现在又只有现成的utf8版本,没有gbk版本.我们原来使用的是gbk编码的,最近想改版,顺便升级一下,就索性把gbk也换成utf8吧,这样以后也方便,国际化嘛! 第一 ...

  6. 利用Filter和拦截器,将用户信息动态传入Request方法

    前言: 在开发当中,经常会验证用户登录状态和获取用户信息.如果每次都手动调用用户信息查询接口,会非常的繁琐,而且代码冗余.为了提高开发效率,因此就有了今天这篇文章. 思路: 用户请求我们的方法会携带一 ...

  7. MongoDB $type条件操作符

    描述 在本章节中,我们将继续讨论MongoDB中条件操作符 $type. $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果. MongoDB 中可以使用的类型如下表所示: 类型 ...

  8. HTML DOM 改变 HTML 内容

    HTML DOM 允许 JavaScript 改变 HTML 元素的内容. 改变 HTML 输出流 JavaScript 能够创建动态的 HTML 内容: 今天的日期是: Thu Feb 25 201 ...

  9. Elastic-Job——分布式定时任务框架

    摘要: Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.去掉了和dd-job中的监控和ddframe接入规范部分.该项目基于成熟的开源产品Quartz和Z ...

  10. 自写JQ控件-树状菜单控件[demo下载]

    一个多月没有写博客了,最近也弄一个基于JQ的树状菜单控件,在此分享给大家.另外呢,通过这个例子分享一下怎么写JQ控件的. 事实上工作中,也是经常遇到的,有些时候自己想实现一些前端效果,用网上一些插件吧 ...