Mongo散记--聚合(aggregation)& 查询(Query),mongoaggregation
mongo官网:http://www.mongodb.org/
工作中使用到Mongo,但是没有系统的学习研究过Mongo,仅对工作过程中,在Mongo的使用过程中的一些知识点做一下记录,并随时补充,达到总结备忘的目的。
本篇主要终结记录聚合和查询。
聚合(aggregation)
Count
db.view_view.count()
db.view_view.count({_id:"521842"})
db.view_view.find().count()
db.view_view.find({_id:"521842"}).count()
Distinct
db.view_view.distinct("_id")
db.view_view.distinct("view") view是个数组,会把每个数组的元素都distinct一下
Group
db.invoke_stat.group({
key:{ip:true},
cond:{
date:{$gte:ISODate("2014-07-09 16:00:00"),$lt:ISODate("2014-07-10 16:00:00")}
},
reduce:function(curr,result){
result.count += curr.times;
},
initial:{count:0},
finalize:function(result) {result.count = '$' + result.count}
});
db.view_view.group({
keyf:function(doc){return {view_num:doc.view.length}},
reduce:function(curr,result){
result.count += 1;
result.id = curr._id;
},
initial:{count:0}
});关于以上两个group的解释:
key/keyf:要按照进行分组的列,key是直接选取表中的列,kef是一个函数,对列进行一些处理,函数结果要返回一个对象,比如{view_num:doc.view.length},doc.view.length,是表中的数组列view的长度。
cond:是要过滤的查询条件
reduce:处理函数
initial:返回列的初始值
finalize:对reduce的结果进行进一步处理,比如格式化
MapReduce
db.invoke_stat.mapReduce(
function(){
var key = this.ip;
emit(key,{r_times:this.times})
},
function(key,emits){
total=0;
for(var k in emits) {
total+=emits[k].r_times;
}
return {r_times:total}
},
{out:'mr'}
)以上:r_times是我们定义的要返回的列的名称,ip和times是表中的列,mr是我们要把MapReduce的计算结果存入名称为mr的集合中。
mapReduce的原型为:function (map, reduce, optionsOrOutString),下面具体介绍一下函数的三个参数:
map函数,它会遍历集合中的每一个文档,this表示文档,它使用emit方法将文档按键分组,并返回需要统计的数据;
reduce函数,它将收集数据并统计,两个参数分别为map函数返回的key值和数据数组;
optionsOrOutString参数为一个对象,定义了一些额外工作,比如上面的列子中使用out参数将统计结果放入到mr集合中,集合不存在则创建,存在了则覆盖。
参数optionsOrOutString对象除了out键以外还有其它一些键:
finalize函数,同group的finalize完成器一样,可以对reduce的结果做一些处理;
query文档,在map函数前对文档过滤;
sort文档,在map函数前对文档排序,必须先对排序的字段建立索引;
limit整数,在map函数前设定文档数量;
scope文档,js函数中用到的变量,客户端可以通过scope传递一些值;
jsMode布尔,指定了map和reduce函数间传递的对象使用BSON格式还是javascript对象,默认值false,表示采用BSON格式,优点是中间的BSON数据会被存在硬盘上,所以传递的数据量可以很大,但会影响性能;采用javascript对象,性能较高,但只能传递50万个不同的key值;
verbos布尔,默认true,显示详细的时间统计信息。
以上可以看出MapReduce的强大,可以很轻松的实现不同的统计功能。
查询(Query)
mongo查询语法:
db.access_logs_140701.find({jxTime:{$gt:1407011300,$lt:1407011400},"curl.sku":"99978033"}).sort({jxTime:-1}).skip(1).limit(100)
db.invoke_stat.find({date:{$gte:ISODate("2014-07-09 10:00:00"),$lt:ISODate("2014-07-09 11:00:00")}})
db.view_view.find({view:{$size:10}}) 查询数组长度未10的,当前Mongo不直接支持数据长度范围查询,比如查询数据长度<10的,只能MapReduce编程实现
在信道的竞争中所产生的冲突,以及为解决冲突而引入的退避机制都大大降低了系统的吞吐量。802.11n为了解决MAC层的这两个问题,采用了帧聚合(FrameAggregation)技术和BlockAcknowledgement机制。
帧聚合技术又包含针对MSDU的聚合(A-MSDU)和针对MPDU的聚合(A-MPDU):
A-MSDU
A-MSDU技术是指把多个MSDU通过一定的方式聚合成一个较大的载荷。这里的MSDU可以认为是Ethernet报文。通常,当AP或无线客户端从协议栈收到报文(MSDU)时,会打上Ethernet报文头,这里我们称之为A-MSDUSubframe;而在通过射频口发送出去前,需要逐一将其转换成802.11报文格式。而A-MSDU技术旨在将若干个A-MSDUSubframe聚合到一起,并封装为一个802.11报文进行发送。从而减少了发送每一个802.11报文所需的PLCPPreamble、PLCPHeader和802.11MAC头的开销,同时减少了应答帧的数量,提高了报文发送的效率。
A-MPDU
与A-MSDU不同的是,A-MPDU聚合的是经过802.11报文封装后的MPDU,这里的MPDU是指经过802.11封装过的数据帧。通过一次性发送若干个MPDU,减少了发送每个802.11报文所需的PLCPPreamble、PLCPHeader,从而提高系统吞吐量。
aggregate 是指事物的总和,比如数字总和,人数总和等,是一种侧重强调事物在数量的集合;
aggregation是指集群效应,比如城市集群,电路集群等,该词倾向于形容事物在规模上的聚集;