mongo中的⾼级查询之聚合操作(distinct,count,group)Mongodb中⾃带的基本聚合函数有三种:count、distinct和group。下⾯我们分别来讲述⼀下这三个基本聚合函数。
(1)count
作⽤:简单统计集合中符合某种条件的⽂档数量。
使⽤⽅式:unt(<query>)或者db.collection.find(<query>).count()
参数说明:其中<query>是⽤于查询的⽬标条件。如果出了想限定查出来的最⼤⽂档数,或者想统计后跳过指定条数的⽂档,则还需要借助于limit,skip。
举例:
(2)distinct
作⽤:⽤于对集合中的⽂档针进⾏去重处理
使⽤⽅式:db,collection.distinct(field,query)
参数说明:field是去重字段,可以是单个的字段名,也可以是嵌套的字段名;query是查询条件,可以为空;
举例:
除了上⾯的⽤法外,还可以使⽤下⾯的另外⼀种⽅法:
db.runCommand({"distinct":"collectionname","key":"distinctfied","query":<query>})
collectionname:去重统计的集合名,distinctfield:去重字段,,<query>是可选的限制条件;
举例:
这两种⽅式的区别:第⼀种⽅法是对第⼆种⽅法的封装,第⼀种只返回去重统计后的字段值集合,但第⼆种⽅式既返回字段值集合也返回统计时的细节信息。
(3)group
作⽤:⽤于提供⽐count、distinct更丰富的统计需求,可以使⽤js函数控制统计逻辑
使⽤⽅式:up(key,reduce,initial[,keyf][,cond][,finalize])
备注说明:在2.2版本之前,group操作最多只能返回10000条分组记录,但是从2.2版本之后到2.4版本,mongodb做了优化,能够⽀持返回20000条分组记录返回,如果分组记录的条数⼤于20000条,那么可能你就需要其他⽅式进⾏统计了,⽐如聚合管道或者MapReduce;
===========================================================
mongo中的⾼级查询之聚合操作(distinct,count,group)
1.distinct的实现:
类似于mysql中的 select  count(*) from  consumerecords where act="charge"
(1).分组求和:类似于mysql中的 select act,sum(count) from  consumerecords group by act
{
key:{act:true},
initial:{ct:0},
$reduce:function(doc,prev)
{
< = + unt
}
}
)
(2).分组求和,过滤。类似mysql中的select act,sum(count) from  consumerecords group by act having act='charge';
{
key:{act:true},
initial:{ct:0},
$reduce:function(doc,prev)
{
< = + unt
},
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按时间分组(时间格式化)
up({
keyf : function(doc){
var date = new Date(doc.start);
var dateKey = ""+FullYear()+"-"+(Month()+1)+"-"+Date();
distinct查询return {'day':dateKey};
},
initial : {count:0},
reduce : function Reduce(doc, out) {
}
});
javascriptz中时间的相关函数参考:
(4).group 分组⽅法实现的讲解。
group 的完整语法是。
{
key:{act:true},
initial:{ct:0},
$reduce:function(doc,prev)
{
< = + unt)
},
finalize:function(doc)
     {
      = +  100
     },
condition:{act:"charge"}
}
)
参数解释:
key:需要分组的键或是函数(function),group分组实例3中的key就是⼀个函数值
initial:声明并且初始化变量。每⼀组共享⼀个变量值。多个变量之间⽤逗号隔开
$reduce:循环体,集合中有多少个⽂档,就会循环多少次。函数(function)中变量doc表⽰当前⽂档对象,
prev表⽰累积处理的结果对象(这个地⽅可能描述的不是很情况,⾃⼰慢慢体会)
finalize:可选参数,可以简单理解为对分组之后的结果的再次处理,doc表⽰group之后的⽂档对象(这⼀步也是⼀个循环体condition:可选参数,对已经分组好的结果进⾏过滤,有点类似于mysql中的having
4.mapReduce:暂缺,要想玩转这个⽅法需要有很强的JavaScript功能。
据说mapReduce 可以实现很复杂的查询,可以将⼀个复杂的查询分拆到多个机器上运⾏,
然后把各个结果集组合起来,形成最终结果。但是很慢。
mapreduce⽤法⼤全
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)
    {
<=)+unt)        },
condition:{act:"charge"}
  }
}
)
mongo的聚合操作
聚合框架:
javascript数据类型转换

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。