Mongo散记–聚合(aggregation)& 查询(Query)

Mongo散记–聚合(aggregation)& 查询(Query)

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

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函数中用到的变量,client能够通过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编程实现

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118626.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月3日 下午4:00
下一篇 2021年12月3日 下午5:00


相关推荐

  • 计算两个矩阵之间的欧式距离「建议收藏」

    计算两个矩阵之间的欧式距离「建议收藏」在我们使用k-NN模型时,需要计算测试集中每一点到训练集中每一点的欧氏距离,即需要求得两矩阵之间的欧氏距离。在实现k-NN算法时通常有三种方案,分别是使用两层循环,使用一层循环和不使用循环。使用两层循环分别对训练集和测试集中的数据进行循环遍历,计算每两个点之间的欧式距离,然后赋值给dist矩阵。此算法没有经过任何优化。num_test=X.shape[0]num_…

    2022年6月19日
    96
  • IO编程与线程概念

    IO编程与线程概念IO编程IO在计算机中指Input/Output,也就是输入和输出。由于程序和运行时数据是在内存中驻留,由CPU这个超快的计算核心来执行,涉及到数据交换的地方,通常是磁盘、网络等,就需要IO接口。比如你打开浏览器,访问新浪首页,浏览器这个程序就需要通过网络IO获取新浪的网页。浏览器首先会发送数据给新浪服务器,告诉它我想要首页的HTML,这个动作是往外发数据,叫Output,随后新浪

    2022年5月15日
    33
  • git fetch 更新远程代码到本地仓库

    git fetch 更新远程代码到本地仓库

    2021年11月8日
    55
  • 大学《数据库系统》课程设计报告「建议收藏」

    大学《数据库系统》课程设计报告「建议收藏」湖南科技大学计算机科学与工程学院《数据库系统》课程设计题目:教学管理系统专业:计算机科学与技术年级:2017级班级:计科三班学号:170510323姓名:雨萱完成时间:2019年1月3日教务管理系统的分析与实现一.实验目的数据库系统课程设计是为了配合数据库原理及应用开发而…

    2022年5月12日
    26
  • 背板带宽

    背板带宽交换机的背板带宽 是交换机接口处理器或接口卡和数据总线间所能吞吐的最大数据量 背板带宽标志了交换机总的数据交换能力 单位为 Gbps 也叫交换带宽 一般的交换机的背板带宽从几 Gbps 到上百 Gbps 不等 一台交换机的背板带宽越高 所能处理数据的能力就越强 但同时设计成本也会越高 nbsp nbsp nbsp 一般来讲 计算方法如下 nbsp nbsp nbsp nbsp nbsp nbsp 1 线速的背板带宽 nbsp nbsp nbsp 考察交换机上所有端口能提供的总带宽 计算公

    2026年3月20日
    3
  • 数字水印算法

    数字水印算法任务背景及简介随着互联网的普及和数字技术的广泛应用 信息媒体的数字化极大地提高了信息的存取效率 Intenet 的普及又为数字信息在世界范围内的迅速传递开辟了便捷的途径 数字产品变得极大丰富并且传播便捷 但与此同时版权保护问题也日益突出 传统的信息安全技术在数字产品版权保护方面存在的不足 促成了数字水印技术的发展 数字水印技术将数字水印隐藏于数字媒体中 以便在版权纠纷中为版权所有者提供版权证明 然而数字水印技术处在起步阶段 许多技术还不成熟 很多问题和方法有待进一步的研宄和解决 本实验课题主要是

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号