一.MongoDB中的Count函数、Distinct函数以及分组

准备工作,插入一个班级的文档

> for(var i=0;i<10;i++){

... db.Classes.insert({ClassName:"Class"+i,_id:i});

... }

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

>

1.count函数

如上面,如果要统计班级的数目,可以使用count函数进行统计

> db.Classes.find().count()

10

>

2.Distinct函数

修改一下Classes文档,添加一条重复的数据

> db.Classes.insert({_id:10,ClassName:"Class9"})

WriteResult({ "nInserted" : 1 })

> db.Classes.find()

{ "_id" : 0, "ClassName" : "Class0" }

{ "_id" : 1, "ClassName" : "Class1" }

{ "_id" : 2, "ClassName" : "Class2" }

{ "_id" : 3, "ClassName" : "Class3" }

{ "_id" : 4, "ClassName" : "Class4" }

{ "_id" : 5, "ClassName" : "Class5" }

{ "_id" : 6, "ClassName" : "Class6" }

{ "_id" : 7, "ClassName" : "Class7" }

{ "_id" : 8, "ClassName" : "Class8" }

{ "_id" : 9, "ClassName" : "Class9" }

{ "_id" : 10, "ClassName" : "Class9" }

现在我想查询所有ClassName,去掉重复的,可以执行下面的操作。

> db.runCommand({distinct:"Classes",key:"ClassName"}).values

[

"Class0",

"Class1",

"Class2",

"Class3",

"Class4",

"Class5",

"Class6",

"Class7",

"Class8",

"Class9"

]

>

去重语法 db.runCommand({distinct:"数据集合名字",key:"需要去重的键"}).values

3.Group分组操作(比较复杂)

语法:

db.runCommand({group:{

ns:集合名字,

Key:分组的键对象,

Initial:初始化累加器,

$reduce:组分解器,

Condition:条件,

Finalize:组完成器

}})

1).key:用来分组文档的字段。和keyf两者必须有一个

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

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

4).reduce:执行的reduce函数。函数需要返回值。

5).cond:执行过滤的条件。

6).finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

具体的使用可以参考手册:http://mongodb-documentation.readthedocs.org/en/latest/reference/command/group.html

分组首先会按照key进行分组,每组的 每一个文档全要执行$reduce的方法,他接收2个参数一个是组内本条记录,一个是累加器数据.

新建一个persons集合,插入一下数据

var persons = [{

name:"Tom",

age:25,

country:"USA"

},

{

name:"Jack",

age:25,

country:"USA"

},

{

name:"Lucy",

age:26,

country:"USA"

},

{

name:"DaChengzi",

age:27,

country:"China"

},

{

name:"Xiaojuz",

age:26,

country:"China"

},

{

name:"DaPingguo",

age:27,

country:"China"

},

{

name:"XiaoBoluo",

age:27,

country:"China"

},

{

name:"Bangzi1",

age:26,

country:"Korea"

},

{

name:"LiShishi",

age:27,

country:"Korea"

},

{

name:"Rain",

age:21,

country:"Korea"

},

{

name:"CangJingkong",

age:30,

country:"Japan"

}]

for(var i = 0;i<persons.length;i++){

db.persons.insert(persons[i])

}

插入完成后,查看一下:

现在我有一个需求,想要找到每个国家当中年纪最大的人,并且年纪不大于30岁,输出他们的名字

思路: ①先按照国家进行分组

②找到每个国家中年纪最小的

③判断年纪是不是小于30

编写查询:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

condition:{age:{$lt:30}}

}})

运行结果:

{

"retval" : [

{

"country" : "USA",

"age" : 26,

"name" : "Lucy"

},

{

"country" : "China",

"age" : 27,

"name" : "DaChengzi"

},

{

"country" : "Korea",

"age" : 27,

"name" : "LiShishi"

}

],

"count" : 10,

"keys" : 3,

"ok" : 1

}

从结果看到日本女士苍井空的年龄是30,被我筛选掉了…...

Finallize的使用,如果觉得返回的东西太过单调,可以使用finalize进行再次的修改

例如:

db.runCommand({group:{

ns:"persons",

key:{"country":true},

initial:{age:0},

$reduce:function(doc,prev){

if(doc.age>prev.age){

prev.age=doc.age;

prev.name = doc.name;

prev.country = doc.country;

}

},

finalize:function(prev){

prev.age = "Age is" +prev.age;

prev.name = "Name is " + prev.name;

prev.country = "Country is " + prev.country;

},

condition:{age:{$lt:30}}

}})

加上上面之后,查询的结果如下:

{

"retval" : [

{

"country" : "Country is USA",

"age" : "Age is26",

"name" : "Name is Lucy"

},

{

"country" : "Country is China",

"age" : "Age is27",

"name" : "Name is DaChengzi"

},

{

"country" : "Country is Korea",

"age" : "Age is27",

"name" : "Name is LiShishi"

}

],

"count" : 10,

"keys" : 3,

"ok" : 1

}

可以看到每一项数据前面,都加上了说明文字,所以说finialize是可以对分完组之后的数据在做一次修改的。

二.命令执行器(db.runCommand())

1.之前我们遇到删除集合,一般使用的方法是 db.集合名.drop()

使用命令执行器:

db.runCommand({drop:"集合"})

2.查找MongoDB为我们提供的命令

①在shell中执行:db.listCommands()

②访问网址http://127.0.0.1:28017/_commands

3.常用命令

三.固定集合(Capped Collection)

1.解释:就是固定size的集合呗。

2.特点:性能出色的有着固定大小的集合,以LRU(Least Recently Used最近最少使用)规则和插入顺序进行age-out(老化移出)处理,自动维护集合中对象的插入顺序,在创建时需要预先指定大小。如果空间用完,新添加的对象将会取代集合中最旧的对象永远保持最新的数据

总结就是以下:

①固定集合默认是没有索引的就算是_id也是没有索引的

②由于不需分配新的空间他的插入速度是非常快的

③固定集合的顺是确定的导致查询速度是非常快的

④最适合的是应用就是日志管理

3.使用

①创建一个固定集合

创建一个新的固定集合要求大小是100个字节,可以存储文档10个

> db.createCollection("myCapped",{size:100,capped:true,max:10})

{ "ok" : 1 }

>

②把一个普通集合转成固定集合

> db.runCommand({convertToCapped:"Classes",size:100000})

{ "ok" : 1 }

>

③插入数据

文档最大为10个,那么当插入11条数据的时候,会出现什么情况呢,根据之前的概念,应该是吧第一条数据踢出去,然后加入最后一条

> for(var i = 0; i<11;i++){

... db.myCapped.insert({name:"name"+i,_id:i})

... }

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 1, "name" : "name1" }

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

>

> db.myCapped.insert({name:"name11",_id:11})

WriteResult({ "nInserted" : 1 })

> db.myCapped.find()

{ "_id" : 2, "name" : "name2" }

{ "_id" : 3, "name" : "name3" }

{ "_id" : 4, "name" : "name4" }

{ "_id" : 5, "name" : "name5" }

{ "_id" : 6, "name" : "name6" }

{ "_id" : 7, "name" : "name7" }

{ "_id" : 8, "name" : "name8" }

{ "_id" : 9, "name" : "name9" }

{ "_id" : 10, "name" : "name10" }

{ "_id" : 11, "name" : "name11" }

>

④删除数据

> db.myCapped.remove({_id:11})

WriteResult({

"nRemoved" : 0,

"writeError" : {

"code" : 10101,

"errmsg" : "cannot remove from a capped collection: mongoDBTest.myCapped"

}

})

>

如上例,固定集合是不能进行数据删除的。

综上:固定集合有点像一个队列,先进先出,大小不变。

MongoDB中的分组的更多相关文章

  1. 浅析mongodb中group分组

    这篇文章主要介绍了浅析mongodb中group分组的实现方法及示例,非常的简单实用,有需要的小伙伴可以参考下. group做的聚合有些复杂.先选定分组所依据的键,此后MongoDB就会将集合依据选定 ...

  2. MongoDB中的group

    在Mongodb的查询中,有类似于SQL中group by功能的group函数.两者的功能有些类似,但是区别也是比较明显的. 对于SQL来说,group by的作用就是安装依据列来将数据表中的记录分成 ...

  3. MongoDB学习笔记~管道中的分组实现group+distinct

    回到目录 mongoDB的管道是个好东西,它可以将很多操作批处理实现,即将多个命令放入一个管道,然后去顺序的执行它们,今天我要说的是,利用管道中的分组来实现实现中的ditinct+group的效果,即 ...

  4. 在MongoDB中实现聚合函数 (转)

    随着组织产生的数据爆炸性增长,从GB到TB,从TB到PB,传统的数据库已经无法通过垂直扩展来管理如此之大数据.传统方法存储和处理数据的成本将会随着数据量增长而显著增加.这使得很多组织都在寻找一种经济的 ...

  5. MongoDB实战指南(五):MongoDB中的聚集分析

    聚集操作是对数据进行分析的有效手段.MongoDB主要提供了三种对数据进行分析计算的方式:管道模式聚集分析,MapReduce聚集分析,简单函数和命令的聚集分析. 1. 管道模式进行聚集 这里所说的管 ...

  6. 使用highcharts显示mongodb中的数据

    1.mongodb数据表相关 # 显示数据库 show dbs # 数据库 use ceshi # 显示表 show tables # 创建集合 db.createCollection('infoB' ...

  7. MongoDB中的MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

  8. 详解MongoDB中的多表关联查询($lookup)

    一.  聚合框架 聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息. 聚合管道操作主要包含下面几个部分: 命令 功能描述 $projec ...

  9. MongoDB中MapReduce介绍与使用

    一.简介 在用MongoDB查询返回的数据量很大的情况下,做一些比较复杂的统计和聚合操作做花费的时间很长的时候,可以用MongoDB中的MapReduce进行实现 MapReduce是个非常灵活和强大 ...

随机推荐

  1. FlowLayoutPanel autowrapping doesn't work with autosize

    There is no such thing like impossible in software development. Impossible just takes longer. I've i ...

  2. [liu yanling]测试小结

    编写测试用例,业务了解是基础,结合业务编写测试用例,重要的逻辑一定要覆盖

  3. java基础之运算符

    运算符是用于表示数据的赋值,运算和比较的一种特殊符号.1.赋值运算符:=,+=,-=,*=,/=,%= x=1;x+=2;(相当于x=x+2,等于3),其他运算符同理 2.算术运算符:+,-,*,/, ...

  4. POJ 2533 Longest Ordered Subsequence (LIS DP)

    最长公共自序列LIS 三种模板,但是邝斌写的好像这题过不了 N*N #include <iostream> #include <cstdio> #include <cst ...

  5. globalfifo设备驱动

    把globalmem中的全局内存变成一个FIFO,只有当FIFO中有数据的时候(即有进程把数据写到这个FIFO而且没有被读进程读空),读进程才能把数据读出,而且读取后的数据会从globalmem的全局 ...

  6. windows 7 下安装 IIS 和 ArcGis Server 9.3 遇到的问题及解决方法

    windows 7 下安装 IIS 和 ArcGis Server 9.3 遇到的问题及解决方法 分类: ArcGIS server 计算机2012-07-31 14:17 631人阅读 评论(0)  ...

  7. hdoj 1465 不容易系列之一

    转 原文网址   http://blog.csdn.net/liwen_7/article/details/7646451 错排问题 错排问题 就是一种递推式,不过它比较著名且常用,所以要熟记! 方法 ...

  8. IOS - view之间切换

    //进入下一页 - (IBAction)Go:(id)sender { TwoViewController *twoVC = [[TwoViewController alloc] init];//这里 ...

  9. 基于Cloudera Manager5配置HIVE压缩

    [Author]: kwu 基于Cloudera Manager5配置HIVE压缩,配置HIVE的压缩.实际就是配置MapReduce的压缩,包含执行结果及中间结果的压缩. 1.基于HIVE命令行的配 ...

  10. ApkTool动态打包

    引言: APK在推广的时候可能会须要动态打包APK.比方公布到不同渠道的时候,须要在manifest文件里改动渠道信息.或者app在推广的时候.须要在apk包里面加上推广人信息等. 环境变量: 1.J ...