zoukankan      html  css  js  c++  java
  • MongoDB学习笔记-05 聚合

    MongoDB除了基本查询功能之外,还有强大的聚合工具,其中包括:count()、distinct()、group()、mapreduce.

    计数函数count

    count是最简单的聚合工具,用于返回文档的数量:

    >db.user.count() // 返回集合user的个数

    传递查询文档时,则计算查询结果的数量:

    >db.user.count({"age":{"$lt":20}}) // 返回年龄小于20岁的用户数

    该函数对于分页时的总数非常有必要

    去重函数distinct

    distinct函数用来找出给定键的所有不同的值。使用时必须指定集合和键:

    >db.runCommand({"distinct":"user","key":"age"}) // 获取age键的不同的值

    有时候需要获取集合中所有不同的键,此时需要自己编写MapReduce,内置没有这样的函数。

    clip_image001

    values返回键所对应的所有不同的值,数组形式。

    stats返回distinct过程的一些指标。

    n:返回的集合数量,

    nscanned:扫描过的文档数量,

    timems:耗费的时间(毫秒),

    cursor:使用的索引(BasicCursor:无索引,BtreeCursor)

    分组函数group

    MongoDB会根据分组依据的键将集合分成若干个组,再聚合每个组内的文档。

    >db.runCommand({"group":{

    "ns":"user",

    "key":"day",

    "initial":{"time":0},

    "$reduce":function(doc,prev){

       if(doc.time>prev.time){

          prev.price = doc.price;

          prev.time = doc.time;

        }

    },

    "condition":{"day":{"$gt":"2014/12/21"}}

    }})

    "ns":"user":指定分组的集合为user

    "key":"day":指定文档分组依据的键

    "initial":{"time":0}每一组reduce函数调用的时间,会作为初始文档传递给后续过程。

    "$reduce":每个文档都对应一次这个调用。系统会传递两个参数:当前文档和累加器文档。

    "condition":指定条件

    使用完成器:finalizer

    完成器finalizer用于精简数据库传给用户的数据,group命令的输出一定要能放到单个数据库响应中。

    >db.runCommand({"group":{

       "ns":"post",

       "key":"{"tags":true}", // 等同于"key":"tags"

       "initial":{"tags":{}},

       "$reduce":function(doc,prev){

          for(i in doc.tags){

             if(doc.tags[i] in prev.tags){

                prev.tags[doc.tags[i]]++;

             }else{

                Prev.tags[doc.tags[i]]=1;

             },

       "finalize":function(prev){

          var mostPopular = 0;

          for(i in prev.tags){

             if(prev.tags[i]>mostPopular){

                prev.tag=i;

                mostPopular=prev.tags[i];

             }

          }

         Detete prev.tags

      }

    }}})

    将$reduce处理后的结果再进行处理,然后返回给客户端。

    将函数作为键使用

    定义分组函数时使用"$keyf"代替"key":

    "$keyf":function(x){return x.category.toLowerCase();}

    MapReduce

    count、distict、group能做的事,MapReduce都能做。MapReduce的基本使用如下:

    >mr=db.runCommand({"mapreduce":"user","map":map,"reduce":reduce})

    "mapreduce":对哪个集合作处理

    "map":map函数,可以在上述命令前先定义

    "reduce":reduce函数,可以在上述命令前先定义

    map函数使用函数emit返回要处理的值,this表示对当前文档的引用:

    >map=function(){

       for(var key in this){

          emit(key,{ "count":1});

       }};

    reduce能处理emit返回的文档和其他reduce结构的各种组合:

    >reduce=function(key,emits){

       total = 0;

       for(var I in emits){

          total+=emits[i].count;

       }

       return {"count":total};

    }

    MapReduce函数的返回文档类似如下:

    clip_image002

    result:存放mapreduce结果的集合名,为临时集合,mapreduce连接关闭后自动删除。

    timeMillis:操作花费的时间,单位毫秒

    input:发生到map函数的文档个数

    emit:在map函数中emit被调用的次数

    output:结果集合中创建的文档数量。

    MapReduce的其他可选键

    MapReduce命令除了必须的键:mapreduce、map、reduce之外,还有如下的可选键:

    finalize:对reduce的输出结果作进一步处理

    keeptemp:连接关闭时,临时集合是否保存。

    output:结果集合的名字,设定该项则隐含着keeptemp:true。

    query:会在发往map函数前,先用指定条件过滤文档。

    sort:在发往map前先给文档排序。

    limit:发往map函数的文档数量的上限。

    scope:javaScript代码中要用到的变量(变量名:值)。

    verbose:是否产生更加详细的服务器日志。

  • 相关阅读:
    小小的学习FPGA建议
    不厌其烦的四大集成电路
    关于FPGA复位的认识
    FPGA与图像处理
    谈谈对zynq的浅显理解
    嵌入ARM硬核的FPGA
    FPGA时序约束一点总结
    FPGA时序优化简单窍门
    学习FPGA,踏上一步台阶
    使用poi读取word2007(.docx)中的复杂表格
  • 原文地址:https://www.cnblogs.com/Jxwz/p/4178925.html
Copyright © 2011-2022 走看看