码迷,mamicode.com
首页 > 数据库 > 详细

MongoDB之聚合

时间:2015-08-18 16:29:21      阅读:147      评论:0      收藏:0      [点我收藏+]

标签:mongodb   聚合数据   文档   sql   

MongoDB除了基本的查询功能,还提供了很多强大的聚合工具。

count

和SQL中类似,用来统计集合中的文档数量总和:
技术分享
不管集合有多大,count都能够快速的返回文档数量。
可以添加筛选条件,但需要牺牲查询性能:

db.lf.count({"name":"rrrr"})

distinct

用来找出给定键的所有不同值,使用时必须指定集合和键:
技术分享


group

group会促使MongoDB将集合依据选定键值的不同分成若干组,然后通过聚合每一组内的文档,产生一个结果文档。讲的有点模糊?看下面的例子:

db.runCommand(
{
  "group":
  {
    "ns":"lf",
    "key":{"name":true},
    "initial":{"count":0},
    "$reduce":function(doc,prev)
    {
      prev.count++;
    },
    "condition":{"age":{"$gt":20}}
  }
}
)

通过ns指定要分组的集合:

   "ns":"lf",

通过key完成文档分组的依据:

"key":{"name":true},

这里说明所有name键的值相同的文档会被划分到一组,true代表会返回键name的值。
initial代表初始化,可以用来设置累加器变量

 "initial":{"count":0},

$reduce表示函数调用

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

condition用来存放筛选条件:

"condition":{"age":{"$gt":20}}

最后执行结果为:
技术分享


finalize

下面介绍一下完成器finalize,完成器用于精简从数据库传到用户的数据,也就是说,可以针对查询结果进一步过滤:

db.runCommand(
  {
    "group":
    {
      "ns":"lf",
      "key":{"name":true},
      "initial":{"count":0},
      "$reduce":function(doc,prev)
      {
        prev.count++;
      },
      "finalize":function(doc)
      {
        doc.num=doc.count;
        delete doc.count;
      }
    }
  }
)

finalize能够修改传递的参数,也能够返回新值,结果如下:
技术分享


$keyf

有些时候分组所依据的条件很复杂,不仅是一个键.比如要使用group计算每个类别有多篇博客文章.由于有很多作者,给文章分类时可能不规律的使用了大小写。
所以,如果要是按类别名来分组,最后”MongoDB”和”mongodb”就是不同的组.为了消除这种大小写的影响,就要定义一个函数来确定文档所依据的键。定义分组要用到$keyf:

db.runCommand(
 {
  "group":
   {
    "ns":"lf",
    "$keyf":function(doc){return {"name":doc.username.toLowerCase()}},
    "initial":{"count":0},
    "$reduce":function(doc,prev)
       {
        prev.count++;
       }
   }
 }
)

版权声明:本文为博主原创文章,未经博主允许不得转载。

MongoDB之聚合

标签:mongodb   聚合数据   文档   sql   

原文地址:http://blog.csdn.net/mevicky/article/details/47751163

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!