mongodb group包(最具体的、最受欢迎、最容易理解的解释)

和数据库一样group经常常使用于统计。MongoDB的group还有非常多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键。好像还不能利用索引[不非常确定]。

Group大约须要一下几个參数。

1.key:用来分组文档的字段。

和keyf两者必须有一个

2.keyf:能够接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个

3.initial:reduce中使用变量的初始化

4.reduce:运行的reduce函数。函数须要返回值。

5.cond:运行过滤的条件。

6.finallize:在reduce运行完毕,结果集返回之前对结果集终于运行的函数。可选的。

以下介绍一个实例:

先插入測试数据:

for(var i=1; i<20; i++){
var num=i%6;
db.test.insert({_id:i,name:"user_"+i,age:num});
}
 

1.普通分组查询

db.test.group({
                       key:{age:true},
                       initial:{num:0},
                       $reduce:function(doc,prev){
                              prev.num++
                       }
                      });

db.runCommand({group:
{
ns:"test",
key:{age:true},
initial:{num:0},
$reduce:function(doc,prev)
{
prev.num++
}
}
});
 

2.筛选后再分组

db.test.group({
key:{age:true},
initial:{num:0},
$reduce:function(doc,prev)
{
prev.num++
},
condition:{age:{$gt:2}}
});

db.runCommand({group:
{
ns:"test",
key:{age:true},
initial:{num:0},
$reduce:function(doc,prev)
{
prev.num++},
condition:{age:{$gt:2}}
}
});

3、普通的$where查询:

db.test.find({$where:function(){
return this.age>2;
}
});

group联合$where查询

db.test.group({
key:{age:true},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++
},
condition:{$where:function(){
return this.age>2;
}
}
});

4、使用函数返回值分组

//注意,$keyf指定的函数一定要返回一个对象

db.test.group({
$keyf:function(doc){return {age:doc.age};},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++
}
});

db.runCommand({group:
{
ns:"test",
$keyf:function(doc){return {age:doc.age};},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++}
}
});
 

5.使用终结器

db.test.group({
$keyf:function(doc){return {age:doc.age};},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++
},
finalize: function(doc){ doc.count=doc.num;delete doc.num; }
});

db.runCommand({group:
{
ns:"test",
$keyf:function(doc){return {age:doc.age};},
initial:{num:0},
$reduce:function(doc,prev){
prev.num++},
finalize: function(doc){ doc.count=doc.num;delete doc.num; }
}
});

有关MapReduce

//首先插入測试数据

for(var i=1;i<21;i++)
{
db.test.insert({_id:i,name:'mm'+i});
}

//进行mapreduce
db.runCommand(
{
mapreduce:'test',
map:function(){emit(this.name.substr(0,3),this);},
reduce:function(key,vals){return vals[0];}, //注意:vals是一个Object对象而不是数组
out:'wq'
});

注意:

1.mapreduce是依据map函数里调用的emit函数的第一个參数来进行分组的

2.仅当依据分组键分组后一个键匹配多个文档,才会将key和文档集合交由reduce函数处理。比如:

db.runCommand(
{
mapreduce:'test',
map:function(){emit(this.name.substr(0,3),this);},
reduce:function(key,vals){return 'wq';},
out:'wq'
});

运行mapreduce命令后,再查看wq表数据:

db.wq.find()

{ "_id" : "mm1", "value" : "wq" }
{ "_id" : "mm2", "value" : "wq" }
{ "_id" : "mm3", "value" : { "_id" : 3, "name" : "mm3" } }
{ "_id" : "mm4", "value" : { "_id" : 4, "name" : "mm4" } }
{ "_id" : "mm5", "value" : { "_id" : 5, "name" : "mm5" } }
{ "_id" : "mm6", "value" : { "_id" : 6, "name" : "mm6" } }
{ "_id" : "mm7", "value" : { "_id" : 7, "name" : "mm7" } }
{ "_id" : "mm8", "value" : { "_id" : 8, "name" : "mm8" } }
{ "_id" : "mm9", "value" : { "_id" : 9, "name" : "mm9" } }

时间: 2024-08-28 04:06:57

mongodb group包(最具体的、最受欢迎、最容易理解的解释)的相关文章

mongodb group分组(最详细、最通俗、最易理解的讲解)

和数据库一样group常常用于统计.MongoDB的group还有很多限制,如:返回结果集不能超过16M, group操作不会处理超过10000个唯一键,好像还不能利用索引[不很确定]. Group大约需要一下几个参数. 1.key:用来分组文档的字段.和keyf两者必须有一个 2.keyf:可以接受一个javascript函数.用来动态的确定分组文档的字段.和key两者必须有一个 3.initial:reduce中使用变量的初始化 4.reduce:执行的reduce函数.函数需要返回值. 5

MongoDB group 数据不同字段distinct问题解决办法

近日被mongoDB的聚合难住了,条件: 1.表中有字段mac,pv,ip,dates,type 2.要求,根据ip来group,计算pv合计,不重复的mac数,不重复的ip数 3.下面是解决办法,说明:MongoDB权威指南中使用的是对象,即"macs":{},然后在reduce里面用 in来查找,prev.macs[obj.mac]=""来添加,容易出现Unexpected number错误 现在改成数组,并且在finalize 中清除,感觉很方便 1 db.t

mongodb group分组

先插入测试数据: for(var i=1; i<20; i++){ var num=i%6; db.test.insert({_id:i,name:"user_"+i,age:num}); } 说明,如果有_id这个,mongodb就不会生成_id,会采用你提供的_id. 1.普通分组查询 db.test.group({key:{age:true},initial:{num:0},$reduce:function(doc,prev){ prev.num++ }}); [ { &q

MongooseJS 4.6.0 发布,MongoDB 连接包

MongooseJS 4.6.0 发布了, MongooseJS是基于nodejs,使用javascript编程,连接mongodb数据库的软件包,使mongodb的文档数据模型变的优雅起来,方便对mongodb文档型数据库的连接和增删改查等常规数据操作. 改进日志如下: docs(document): clarify the findById and findByIdAndUpdate examples #4471 mdcanhamdocs(schematypes): add details

mongodb group操作 以及管道 aggregate 分组排序分页

分组获取数据: db.express_info.group({ "key":{"express_code":true}, "initial":{"num":"0","mobile":"0"}, "reduce":function(doc,result){result.num++, result.mobile=doc.mobile}, "c

mongoDB group命令详解

http://heipark.iteye.com/blog/1167948 http://rjhym.iteye.com/blog/1224200 http://blog.163.com/lgh_2002/blog/static/440175262012052116455/ http://www.oschina.net/question/3270_34413

数据包的分类和调度-Linux TC的另一种解释

如果从分层递归的角度理解Linux的TC框架,很容易将队列分为有类队列和无类队列,这个角度上看,有类队列和无类队列的地位是平等的.但实际上,它们 之间是有层次关系的.之所以将其分为有类队列和无类队列,完全是实现意义上的,你可以看到,Linux对于TC框架的实现非常紧凑,正是基于这种递归的 "排队规则,类别,过滤器"三元组来进行的.但是抛开实现,我们需要用一种更加合理的方式来彻底理解数据包调度. 1.数据包调度 数 据包调度是一个层次,隔离了网卡驱动的收发模块和协议栈.也就是说,数据包从

Scala中包、类、对象、成员访问权限理解

本文通过下面一个程序简单分析下包.类.对象访问权限的情况: package spark {   package navigation {     private[spark] class Navigator {       protected[navigation] def useStartChar() = println("navigation")       class LegOfJourney {         private[Navigator] val distance =

关于python包,模块,.pyc文件和文件导入理解

参考文献 一.包 包是一个文件夹,用来存放模块和子包. 包里一般会有一个__init__.py的文件(也可以没有). 包里会有一个__pycache__文件夹,存放.py文件经解释器解释后的中间字节码(二进制文件). 二.模块 可以作为模块的文件有.py..pyc..pyo..pyd..so..dll文件. 三..pyc文件与.pyo文件 这两个文件都是二进制文件,由python解释器将.py文件转化成的二进制文件,目的是加快解释速度且可以隐藏源代码. python解释器在解释.py文件时,会优