mongo中的高级查询之聚合操作(distinct,count,group)

1.distinct的实现:

db.consumerecords.distinct("userId"):键值去重  类似于mysql中的 select distinct userId from consumerecords

db.consumerecords.distinct("userId",{act:"charge"}):过滤之后去重,类似于mysql中的select distinct userId from consumerecords where act="charge"

db.consumerecords.distinct("userId").length:去重之后求记录数,类似于mysql中的 select count(distinct userId) from consumerecords

2.count的实现

db.consumerecords.count():类似于 mysql中 select count(*) from consumerecords

db.consumerecords.count({act:"charge"}):类似于mysql中的 select  count(*) from  consumerecords where act="charge"

3.group的实现

(1).分组求和:类似于mysql中的 select act,sum(count) from  consumerecords group by act

db.consumerecords.group(

... {

... key:{act:true},

... initial:{ct:0},

... $reduce:function(doc,prev)

... {

...              prev.ct = prev.ct + doc.count

... }

... }

... )

(2).分组求和,过滤。类似mysql中的select act,sum(count) from  consumerecords group by act having act="charge"

db.consumerecords.group(

... {

... key:{act:true},

... initial:{ct:0},

... $reduce:function(doc,prev)

... {

...              prev.ct = prev.ct + doc.count

... },

condition:{act:"charge"}

...

... }

... )

(3).将时间格式化并且按时间分组求count,不推荐使用这种方法。

db.playerlogs.aggregate({$project:{ userId:1,con:{$concat:[{$substr:[{$year:"$start"},0,4]},"0",{$substr:[{$month:"$start"},0,4]},{$substr:[{$dayOfMonth:"$start"},0,4]}]} ,_id:0}},{$group:{_id:"$con",count:{$sum:1}}},{$sort:{con:1}}) ;

group按时间分组(时间格式化)

http://www.tuicool.com/articles/EjUnQz

db.playerlogs.group({

keyf : function(doc){

var date = new Date(doc.start);

var dateKey = ""+date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate();

return {‘day‘:dateKey};

},

initial : {count:0},

reduce : function Reduce(doc, out) {

out.count++

}

});

javascriptz中时间的相关函数参考:

http://blog.csdn.net/npp616/article/details/7181730

(4).group 分组方法实现的讲解。

group 的完整语法是。

db.consumerecords.group(

... {

... key:{act:true},

... initial:{ct:0},

... $reduce:function(doc,prev)

... {

...              prev.ct = prev.ct + parseInt(doc.count)

... },

finalize:function(doc)

      {

       doc.ct=doc.ct +  100

      },

condition:{act:"charge"}

... }

... )

参数解释:

key:需要分组的键或是函数(function),group分组实例3中的key就是一个函数值

initial:声明并且初始化变量。每一组共享一个变量值。多个变量之间用逗号隔开

$reduce:循环体,集合中有多少个文档,就会循环多少次。函数(function)中变量doc表示当前文档对象,

prev表示累积处理的结果对象(这个地方可能描述的不是很情况,自己慢慢体会)

finalize:可选参数,可以简单理解为对分组之后的结果的再次处理,doc表示group之后的文档对象(这一步也是一个循环体

condition:可选参数,对已经分组好的结果进行过滤,有点类似于mysql中的having

4.mapReduce:暂缺,要想玩转这个方法需要有很强的JavaScript功能。

据说mapReduce 可以实现很复杂的查询,可以将一个复杂的查询分拆到多个机器上运行,

然后把各个结果集组合起来,形成最终结果。但是很慢。

5.db.runCommand的相关命令.

db.runCommand({distinct:"consumerecords",key:"userId"}):键值去重  类似于mysql中的 select distinct userId from consumerecords

db.runCommand({distinct:"consumerecords",key:"userId"}).values.length:去重之后求记录数,类似于mysql中的 select count(distinct userId) from consumerecords

db.runCommand({distinct:"consumerecords",key:"userId",query:{act:"charge"}}):去重之后求记录数,类似于mysql中的 select distinct userId from consumerecords where act="charge"

db.runCommand(

... {

... group:

... {

... ns:"test2",     # 集合名

... key:{iname:true},  # 分组字段

... initial:{dd:0},    # 按照来初始化该值

... $reduce:function(doc,prev)  # 每个文档循环一遍 doc当前文档  ,prev : 经过$reduce之后 ,function返回的值

... {

...             prev.dd=doc.iage+prev.dd    #

... }

...

... }

... }

... )

数值以字符串形式存储的解决方案:

db.runCommand(

{

  group:

  {

    ns:"consumerecords",

    key:{act:true},

    initial:{ct:100,tt:0},

    $reduce:function(doc,prev)

    {

prev.tt=parseInt(prev.tt)+parseInt(doc.count)

    },

condition:{act:"charge"}

  }

}

)

mongo的聚合操作

http://www.cnblogs.com/huangxincheng/archive/2012/02/21/2361205.html

http://www.cnblogs.com/stephen-liu74/archive/2012/09/19/2652308.html

http://www.cnblogs.com/refactor/archive/2012/08/06/2592734.html

聚合框架:

http://dwchaoyue.blog.51cto.com/2826417/1608068

javascript数据类型转换

http://blog.csdn.net/yjq8116/article/details/3219993/

时间: 2024-11-09 06:39:35

mongo中的高级查询之聚合操作(distinct,count,group)的相关文章

mongo中的模糊查询

以下是一个mongo查询的综合应用,即介绍一个生产中实际应用的模糊查询,当然其实也很简单,主要用到mongo中的模糊查询和$or查询,以及并的关系,下面是一个mongo中的一条记录 { "_id" : "ffe6a068-9043-4334-97d2-75387340e655", "file_id" : "ffe6a068-9043-4334-97d2-75387340e655", "name" : &qu

mysql中的高级查询

mysql中的高级查询 以前学习的查询语法:   select 字段名 from 表名 where 条件   其实,查询的语法变化很多: 1. select 可以查询表达式, 表达式就是 运算符+操作数. 比如 1 + 1   2 * 3  2-1+5*9   Math.random() * 1; 可以看出,数据库中,字符串+字符串不是拼接,而是计算加法, 试一试,拿着'1' + 'a123'. 扩充,如果非要让两个字符串是拼接,咋办? 2. 表的别名     其实列也可以起别名:   3. d

MyBatis和elementui中的高级查询和分页

前台 我们需要发送请求和带入参数 有了这两个属性过后需要在data中添加 这个属性是和方法平级的 整个页面 <template> <section> <!--工具条--> <el-col :span="24" class="toolbar" style="padding-bottom: 0px;"> <el-form :inline="true" :model="

LINQ中的高级查询

LINQ查询方法: 1.Method Syntax查询方法方式:主要利用System.Linq.Enumerable类定义的拓展方法和Lambda表达式方法进行查询. 2.Query Syntax查询语句方式. 查询语句和查询方法的关系:编译器负责在编译时将查询语句便以为查询方法,大部分的查询方法都有对应的查询语句姓氏.一般情况下,我们会使用查询语句+查询方法的混合方式进行查询. 常见的高级查询方法分为:聚合.排序.分区.集合.生成. Ⅰ聚合类: <span style="font-siz

mongo中的分页查询

/** * @param $uid * @param $app_id * @param $start_time * @param $end_time * @param $start_page * @param $limit_page * mongodb中的分页查询 */ public static function getUserRevenueInfoList($uid, $source,$app_id, $start_time, $end_time,$skip, $limit){ $match

MongoDB高级查询详细

前言 前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前奏:启动mongdb数据库服务,并进入shell界面 > cmd > cd C:\Program Files\MongoDB\bin  --进入mongdb安装文件的bin目录下. > net start mongoDB;  --开启mongoDB数据库服务 > mongo   --进

hive 高级查询

hadoop hive 高级查询 Hive聚合运算 - Group by (基本内置聚合函数)nmax, min, count, sum, avg 1)Hive基本内置聚合函数与group by 一起使用 2)支持按位置编号分组 set hive.groupby.orderby.position.alias=true; select name,sum(score) from table_name group by name;——>使用表达式 Hive聚合运算-hiving 1)对group by

MYSQL中的多类型查询及高级查询操作

离散查询select * from car where price=30 or price=40 or price=50 or price=60;select * from car where price in(30,40,50,60)取出数据select * from car where price not in(30,40,50,60)去掉数据 聚合函数(统计查询)select count(*) from carselect count(code) from car #取所有的数据条数sel

数据库——基础(数据库操作,表格操作)——增加高级查询

笔记 LAMP:Linx(操作系统) A(阿帕奇)——网页的应用程序 M(Mysql):体积小,应用简单 P(PHP) 第一步:搭建网页环境——A\M\P WAMP:用WAMP搭建环境 DW:更好的显示 数据库的基本操作: 数据库——表结构——字段(列) 每一行数据成为一条数据(记录) 特点:关系型数据库,有严格的规范 1.必须有主键:能够唯一标识一条数据的字段 2 T-SQL:通用的数据库操作语句 自增长列code(主键列) ;连接键表 最后一个字段不加 ,#注释 创建表:create tab