zoukankan      html  css  js  c++  java
  • 转载: 8天学通MongoDB——第三天 细说高级操作

       今天跟大家分享一下MongoDB中比较好玩的知识,主要包括:聚合,游标。

    一: 聚合

          常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce。

    <1> count

            count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样。

     

    <2> distinct

           这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图。

     

    <3> group

        在mongodb里面做group操作有点小复杂,不过大家对sql server里面的group比较熟悉的话还是一眼

    能看的明白的,其实group操作本质上形成了一种“k-v”模型,就像C#中的Dictionary,好,有了这种思维,

    我们来看看如何使用group。

        下面举的例子就是按照age进行group操作,value为对应age的姓名。下面对这些参数介绍一下:

           key:  这个就是分组的key,我们这里是对年龄分组。

           initial: 每组都分享一个”初始化函数“,特别注意:是每一组,比如这个的age=20的value的list分享一个

    initial函数,age=22同样也分享一个initial函数。

           $reduce: 这个函数的第一个参数是当前的文档对象,第二个参数是上一次function操作的累计对象,第一次

    为initial中的{”perosn“:[]}。有多少个文档, $reduce就会调用多少次。

       看到上面的结果,是不是有点感觉,我们通过age查看到了相应的name人员,不过有时我们可能有如下的要求:

         ①:想过滤掉age>25一些人员。

         ②:有时person数组里面的人员太多,我想加上一个count属性标明一下。

     针对上面的需求,在group里面还是很好办到的,因为group有这么两个可选参数: condition 和 finalize。

         condition:  这个就是过滤条件。

         finalize:这是个函数,每一组文档执行完后,多会触发此方法,那么在每组集合里面加上count也就是它的活了。

     

    <4> mapReduce

            这玩意算是聚合函数中最复杂的了,不过复杂也好,越复杂就越灵活。

      mapReduce其实是一种编程模型,用在分布式计算中,其中有一个“map”函数,一个”reduce“函数。

       ① map:

              这个称为映射函数,里面会调用emit(key,value),集合会按照你指定的key进行映射分组。

       ② reduce:

             这个称为简化函数,会对map分组后的数据进行分组简化,注意:在reduce(key,value)中的key就是

          emit中的key,vlaue为emit分组后的emit(value)的集合,这里也就是很多{"count":1}的数组。

       ③ mapReduce:

              这个就是最后执行的函数了,参数为map,reduce和一些可选参数。具体看图可知:

     

    从图中我们可以看到如下信息:

           result: "存放的集合名“;

           input:传入文档的个数。

           emit:此函数被调用的次数。

           reduce:此函数被调用的次数。

           output:最后返回文档的个数。

    最后我们看一下“collecton”集合里面按姓名分组的情况。

     

    二:游标

        mongodb里面的游标有点类似我们说的C#里面延迟执行,比如:

          var list=db.person.find();

        针对这样的操作,list其实并没有获取到person中的文档,而是申明一个“查询结构”,等我们需要的时候通过

    for或者next()一次性加载过来,然后让游标逐行读取,当我们枚举完了之后,游标销毁,之后我们在通过list获取时,

    发现没有数据返回了。

     

    当然我们的“查询构造”还可以搞的复杂点,比如分页,排序都可以加进去。

     var single=db.person.find().sort({"name",1}).skip(2).limit(2);

    那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。

     
    分类: MongoDB
     
    好文要顶 关注我 收藏该文  
    35
    0
     
    关注我
     
    « 上一篇:8天学通MongoDB——第二天 细说增删查改
    » 下一篇:8天学通MongoDB——第四天 索引操作
    posted @ 2012-02-21 13:52 一线码农 阅读(68271) 评论(35编辑 收藏
     

     
      
    #1楼2012-02-21 15:26 BigDataForFuture  
    好,最近能够有更多更深的知识!马上要使用这个玩意!最好有mongodb的.net客户端使用讲解
      
    #2楼[楼主2012-02-21 15:30 一线码农  
    @ gunnima
    驱动只是一层壳,我会放在第七天或者第八天说下,谢谢关注。
      
    #3楼2012-02-21 17:01 volvowall  
    很详细!学习了,弱弱的问一下有asp.net上运用MongoDB的事例吗?
      
    #4楼2012-02-21 17:24 @清道夫  
    朋友,有没有MongoDB的学习文档?
      
    #5楼2012-02-21 21:00 一周寂寞七天  
    问个比较小白的问题,那个CMD下面当sql语句比较多时,我怎么换行呀?就你你的截图里面的一下...谢谢..
      
    #6楼2012-02-21 21:04 轩~雨~阁  
    好东西,楼主加油,学习ing
      
    #7楼[楼主2012-02-21 21:28 一线码农  
    引用 volvowall:很详细!学习了,弱弱的问一下有asp.net上运用MongoDB的事例吗?

    公司项目上用到了,不过无非就是CURD。
      
    #8楼[楼主2012-02-21 21:29 一线码农  
    @ 大龄码农老邓
    下Mongodb权威指南的电子书吧,看官网也行。
      
    #9楼[楼主2012-02-21 21:31 一线码农  
    @ 一周寂寞七天
    比如:xxx.function({ 此时Enter一下就可以换行了。
      
    #10楼[楼主2012-02-21 21:32 一线码农  
    @ 轩~雨~阁
    你的支持是我写作的动力,呵呵。
      
    #11楼2012-02-27 11:08 agile_work  
    与楼主共同进步!
      
    #12楼2012-03-20 15:21 lhfly  
    继续学习。。。
      
    #13楼2012-04-11 14:36 金牛战斗士  
    写的很容易看懂,很适合我这种菜鸟,不明白<img src="http://pic002.cnblogs.com/images/2012/324454/2012041114353662.jpg" alt="" border="0" "="" style="margin: 0px; padding: 0px; border: 0px; max- 400px;"> 中name:1,是啥意思?求解??
      
    #14楼2012-10-19 12:59 JUSTQYX  
    楼主,mapReduce讲得太简单了。我还是看别人的,然后自己试了几下才略懂的。
    推荐其他人参考:http://www.cnblogs.com/daizhj/archive/2010/06/10/1755761.html
      
    #15楼2013-01-18 14:18 lxy15329  
    @ 一周寂寞七天
    换行很简单,只要是没有最后的),你回车之后,会出现...就可以接着输入了
      
    #16楼2013-01-18 14:19 lxy15329  
    聚集的一些操作还可以使用db.runCommand来使用,楼主可以也添加上,把尽量多的方法都展示出来嘛
      
    #17楼2013-03-05 11:25 吕通达  
    楼主,一、<4>中定义函数map reduce格式应该为map = function 和 reduce = function,这样才能运行
      
    #18楼2013-06-20 17:17 飞啊子  
    当然我们的“查询构造”还可以搞的复杂点,比如分页,排序都可以加进去。

    var single=db.person.find().sort({"name",1}).skip(2).limit(2);


    这个地方,是 name:1
      
    #19楼2013-06-20 17:49 飞啊子  
    @ 金牛战斗士

    var single=db.person.find().sort({"name":1}).skip(2).limit(2);

    你写成这样子的

    var single=db.person.find().sort({"name":"1"}).skip(2).limit(2);
    他就自动告诉是什么意思了。
    错误信息:


    > db.user.find().sort({"age":"1"}).skip(1).limit(3);
    error: {
    "$err" : "Attempting to use index type '1' where index types are not a
    owed (1 or -1 only).",
    "code" : 16735
    }
      
    #20楼2013-08-07 22:27 aplixy  
    @ lxy15329
    太感谢了,这个方法足足查了一个礼拜没查出来啊
      
    #21楼2013-09-16 14:09 孙海勋  
    先谢谢楼主分享这么好的东西 
    请问skip 是啥意思 能讲讲吗!
      
    #22楼2013-12-19 16:09 离尘  
    写的很好啊,刚刚接触这个数据库
      
    #23楼2014-02-16 11:31 utopiar  
    @ 孙海勋
    skip即跳过多少条记录,例如db.person.find()能返回10条记录,如果指定skip(3),即跳过了3条记录,实现从第四条记录开始返回
      
    #24楼2014-02-16 11:34 utopiar  
    @ 金牛战斗士
    "name":1,即按ASCII码表顺序排序,同理可指定"name":-1,按ASCII码表的逆序排序
      
    #25楼2014-06-12 16:09 Z武器  
    学习了~~
      
    #26楼2014-08-13 10:31 nickycookie  
    $reduce 加不加$都可以?
      
    #27楼2014-10-07 16:54 undefined  
    那么这样的“查询构造”可以在我们需要执行的时候执行,大大提高了不必要的花销。

    为什么提高了花销?????
      
    #28楼2014-11-12 17:59 静心找灵感  
    运用mapReduce方法时,我输入map function(){....}之后提示我Unexpected token function,这个是怎么回事呢?求大神解答
      
    #29楼2015-06-29 18:43 Kiinlam  
    cmd里面是怎么换行的?
      
    #30楼2015-07-13 11:22 瘦狼望月  
    @ 金牛战斗士
    使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。
      
    #31楼2015-09-15 22:52 trycatchfinally  
    @ 静心找灵感
    这里是类js的语法

    需要这样写
    var map = function(){
    //key,value
    emit(this.name,{count:1});
    }
      
    #32楼2015-09-29 17:29 沉睡的木木夕  
    您好,有个问题需要请教一下:
    我在用sort排序的时候,想在取去重之后在排序 也就是:
    db.person.distinct("age").sort({"age":-1})
    然而却还是跟db.person.distinct("age").sort({"age":1})的结果是一样的
    这是为什么?
    望告诉我下,谢谢了
      
    #33楼2015-10-20 16:24 火云牌神  
    写得很好,对于我这样刚接触的人帮助很大。
      
    #34楼2015-12-28 18:20 jerryli_vip  
    > map
    2015-12-28T18:19:35.834+0800 E QUERY [thread1] ReferenceError: map is not defined :
    @(shell):1:1

    > function (){
    ... emit(this.name, {count:1});
    ... }
    2015-12-28T18:19:36.826+0800 E QUERY [thread1] SyntaxError: function statement requires a name @(shell):1:9

    map报错,是什么情况啊?我用的是3.2版本
      
    #35楼2016-02-22 13:05 辉辉爱编程  
    @ 沉睡的木木夕
    我的理解是。。distinct之后就是一个数组了。。应该不能用sort
  • 相关阅读:
    实例属性 类属性 实例域 类域
    研究数据集
    static 静态域 类域 静态方法 工厂方法 he use of the static keyword to create fields and methods that belong to the class, rather than to an instance of the class 非访问修饰符
    accessor mothod mutator mothod 更改器方法 访问器方法 类的方法可以访问类的任何一个对象的私有域!
    上钻 下钻 切片 转轴 降采样
    识别会话
    Performance Tuning Using Linux Process Management Commands
    Secure Hash Algorithm 3
    grouped differently across partitions
    spark 划分stage Wide vs Narrow Dependencies 窄依赖 宽依赖 解析 作业 job stage 阶段 RDD有向无环图拆分 任务 Task 网络传输和计算开销 任务集 taskset
  • 原文地址:https://www.cnblogs.com/BOSET/p/7069255.html
Copyright © 2011-2022 走看看