浅析mongodb中group分组_MongoDB

group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。
和数据库一样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" } }

以上所述就是本文的全部内容了,希望大家能够喜欢。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mongodb
group分组
mongodb group、mongodb group by、mongodb group count、java mongodb group、mongodb group sort,以便于您获取更多的相关知识。

时间: 2024-10-27 14:15:02

浅析mongodb中group分组_MongoDB的相关文章

mongodb命令行group分组和java代码中group分组

group分组统计是数据库比较常用的功能,mongodb也不例外.不过相对于普通的增删改查,group操作就略微麻烦一些, 这里对group在shell中的操作.使用java原生代码操作以及集成spring进行操作进行一个简单的归纳总结,分组的途径和方法应该都有多种,这里每一样只举一例. 本例中数据源如下: 需要使用group实现的目的是:按年龄分组统计出每一组的数量. 1.mongo shell中执行如下命令: db.test.group({ key:{"age":1}, initi

MYSQL中GROUP分组去除重复数据

GROUP分组去除重复数据 /**  * 清除同一专题中重复导入的数据  * @author tanteng  * @date 2014.07.27  */ public function fuck_repeat(){  set_time_limit(0);  $sql = "SELECT `id` FROM `v95_special_content` GROUP BY `specialid`,`curl` HAVING COUNT(`curl`)>1 ";  $result =

(二十四)mongodb中group的问题二

    今天的工作还是继续昨天没有完成的,由于对mongodb数据库的不熟悉,导致昨天的思路上也出了一点问题,我需要查询出同一个ruleID中不同的processingID的条数,然后根据条数来排列先后顺序,如果条数相等的情况下,就根据updateTime再排序.     昨天的思路是先按数量排序,然后再根据ruleID查出最后的修改时间,因为那个时候实际上还是没有理解group几个参数的真正意思,尤其是对于reduceFunction根本就是硬套.所以代码就写成了 groupBy=GroupB

SQL中Group分组获取Top N方法实现可首选row_number_MsSql

有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万数据,做了如下系列测试: 复制代码 代码如下: CREATE TABLE [dbo].[products]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](50) NULL, [addtime] [datetime] NULL, [city] [nvarchar](10) NULL, CONSTRA

深入浅析Extjs中store分组功能的使用方法_javascript技巧

在项目实践的过程中,遇到需要将grid中数据根据某一字段分组的要求,当然,这个功能在api中有,在此列出来以供大家查找: 两点需要注意的地方: 1.在创建store时,需要设置groupField属性的值,即为需要分组的值 for example: JavaScript代码 Ext.define('Person', { extend: 'Ext.data.Model', fields: ['name', 'sex'] }); 在这个数据模型中,我们需要以性别(sex)分组,那么请看下面的stor

SQL中Group分组获取Top N方法实现可首选row_number

有产品表,包含id,name,city,addtime四个字段,因报表需要按城市分组,统计每个城市的最新10个产品,便向该表中插入了100万数据,做了如下系列测试: 复制代码 代码如下: CREATE TABLE [dbo].[products]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [nvarchar](50) NULL, [addtime] [datetime] NULL, [city] [nvarchar](10) NULL, CONSTRA

浅谈mongodb中query查询_MongoDB

Mongodb最大的功能之一就是它支持动态查询,就跟传统的关系型数据库查询一样,但是它的查询来的更灵活. 一.  Query Expression Objects:查询表达式对象 查询表达式文档也是一个BSON结构的文档,例如,我们可以用下面的查询语句来查询集合中的所有记录: db.users.find({}) 这里,表达式对象是一个空文档,在查询的时候去去匹配所有的记录.再看: 复制代码 代码如下: db.users.find({'last_name': 'Smith'}) 这里,我们将会查询

MongoDB中强大的统计框架Aggregation使用实例解析_MongoDB

听说项目里面Aggregation用的多,那就专门针对这个多多练习一下. 基本的操作包括: •$project - 可以从子文档中提取字段,可以重命名字段 •$match - 可以实现查找的功能 •$limit - 接受一个数字n,返回结果集中的前n个文档. •$skip - 接受一个数字n,丢弃结果集中的前n个文档.效率比较低,依然会遍历前n个文档. •$unwind - 可以将一个包含数组的文档切分成多个, 比如你的文档有 中有个数组字段 A, A中有10个元素, 那么经过 $unwind处

mfc group box 中radiobutton分组问题

问题描述 mfc group box 中radiobutton分组问题 vc的mfc基于对话框程序,动态建一个group box,并在里面动态放入多个radiobutton,为radiobutton添加批处理响应事件后,点击radiobutton无反应,有可能是哪里出问题了,如果radiobutton不放在group box中,无问题 group box代码: groupBox1->Create(_T("种类"), WS_CHILD | WS_VISIBLE | BS_GROUP