在使用mongoDB 中Group时,分组字段不是唯一索引记录数不能大于2000
来源:互联网 发布:网络短信诈骗的论文 编辑:程序博客网 时间:2024/05/24 06:38
我在一次统计中,用mongoDB中的Group 对一张记录数100W表进行汇总。
结果出现异常信息。
Error in executing GroupBy
Command 'group' failed: exception: group() can't handle more than 20000 unique keys (response: { "errmsg" : "exception: group() can't handle more than 20000 unique keys", "code" : 10043, "ok" : 0.0 })
Type: MongoDB.Driver.MongoCommandException
从异常信息可以看出mongoDB中的group是有限制的,非唯一索引记录数不能大于20000,。
不过我没有研究,怎么去设置mongoDB参数,来取消这个限制。
但是可以用mongoDB中mapReduce,依然可以完成统计需求。
mapReduce初级使用可以参考:http://www.kafka0102.com/2010/09/329.html
这里还是简单说一下自己理解mongDB MapReduce原理。
Map 就是映射,Reduce化简。
意思就是在统计的时候我需要先根据你定义的规则来收集信息(执行Map操作),
然后再从你收集的信息里面提取你想要数据(reduce)。
先卡看一下语法:
语法介绍
MapReduce是mongodb中的一个Command,它的语法格式如下:
db.runCommand( { mapreduce : <collection>, map : <mapfunction>, reduce : <reducefunction> [, query : <query filter object>] [, sort : <sort the query. useful for optimization>] [, limit : <number of objects to return from collection>] [, out : <output-collection name>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, verbose : true] });
对于该Command,必有的3个参数我就不解释了。对于可选参数,这里简要说明如下:
(1) query是很常用的,它用来在map阶段过滤查询条件的以限定MapReduce操作的记录范围。
(2) 和query相关的还有sort和limit,我起初以为它俩是用在reduce阶段,实际上和query一起用在map阶段。
(3) mongodb默认是创建一个临时的collection存储MapReduce结果,当客户端连接关闭或者显示使用collection.drop(),这个临时的collection会被删除掉。这也就说,默认的keeptemp是false,如果keeptemp为true,那么结果collection就是永久的。当然,生成的collection名称并不友好,所以可以指定out表明永久存储的collection的名称(这时不需要再指定keeptemp)。当指定out时,并不是将执行结果直接存储到out,而是同样到临时collection,之后如果out存在则drop掉,最后rename临时collection为out。
(4) finalize:当MapReduce完成时应用到所有结果上,通常不怎么使用。
(5) verbose:提供执行时间的统计信息。
第一步:在Map函数中通常我们会用到emit函数。
emit(
this.city, // how to group
{count: 1, age: this.age}// associated data point (document)
);
emit函数有两个参数。
参数1,表示你需要分组的字段。
参数2,分组中每条数据中需要的字段。
在Map执行完成后我们可以想象成,收集的数据存入一个map集合中,group字段是key,value值是分组中多条数据。
举个列子:
有一张表:
班级,学生
1,a
1,b
2,c
2,d
那么map存放的类容。
map1={1:a,1:b},map2={2:c,2:d} (这是value值)
map={1:map1,2:map2};
第二步:然后再执行reduce.
对于map中每一项都会调用一次reduce函数。
具体函数:
function Reduce(key, values) {
/*
var reduced = {count:0, age:0}; // initialize a doc (same format as emitted value)
values.forEach(function(val) {
reduced.age += val.age; // reduce logic
reduced.count += val.count;
});
return reduced;
*/
return values[0];
}
第三步:是可选的选项。这里主要介绍以下finalize
[, query : <query filter object>] [, sort : <sort the query. useful for optimization>] [, limit : <number of objects to return from collection>] [, out : <output-collection name>] [, keeptemp: <true|false>] [, finalize : <finalizefunction>] [, scope : <object where fields go into javascript global scope >] [, verbose : true]
finalize是最终的意思,就是对mapReduce后的数据再一次处理,就相当于在关系数据库中group by以后的having操作。
比如说我们需要过滤count数大于10条记录的。或者求平均数等待。
function Finalize(key, reduced) {
/*
// Make final updates or calculations
reduced.avgAge = reduced.age / reduced.count;
*/
if(reduced.count>10){return;} //过滤记录数大于10
return reduced;
}
- 在使用mongoDB 中Group时,分组字段不是唯一索引记录数不能大于2000
- mongodb命令行group分组和java代码中group分组
- mongodb命令行group分组和java代码中group分组
- oracle 分组函数 在select 中显示不是分组字段的函数
- mongodb中group分组场景应用
- nosql mongodb group分组统计及索引优化
- mongodb group分组
- MongoDB分组group
- MongoDB的group分组
- MongoDB group 使用 $first 获取指定字段
- mysql 中使用group by分组时如何计总数
- mysql字段类型 唯一索引 记录不重复设置
- 在现有表中为某个字段创建唯一的非聚集索引的约束
- 按字段值分组表中记录
- MongoDB 唯一索引
- 不能在具有唯一索引 '' 的对象 '' 中插入重复键的行
- 不能在具有唯一索引 'RoleNameIndex' 的对象 'dbo.AspNetRoles' 中插入重复键的行
- 关于MongoDB的group分组
- 推荐系统学习
- getsockopt()和setsockopt()函数详解
- 使用BO JAVA SDK打开WEBI报表,并进行PDF、EXCEL、CSV、HTML导出
- Tor源码分析五 -- 客户端执行流程(libevent调度)
- Java设计模式之二十九(依赖倒转原则)
- 在使用mongoDB 中Group时,分组字段不是唯一索引记录数不能大于2000
- 我我我
- Windows 7/8建立临时无线网络/分享CMCC无线网络给多个无线设备
- 【JackSon Json】 入门1
- Weka开发[15]-ZeroR源代码介绍(入门篇)
- 关于在UIwebView中访问HTTPS站点的几种方法
- linux下压力测试软件siege的安装与使用详解
- 使用多线程的利弊
- AppDelegate文件下各方法的用法:(应用程序挂起、复原与终止)