MongoDB聚合

1.1 count

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

> db.foo.count()
2
> db.foo.insert({x:1})
WriteResult({ "nInserted" : 1 })
> db.foo.count()
3

不论集合多大,都会很快返回总的文档数量。也可以传递查询,Mongo则会计算查询结果的数量。也可以传递查询,MongoDB则会计算查询结果的数量:

> db.foo.count()
4
> db.foo.count({x:1})
1

对于分页来说有个总数非常必要,然而增加查询条件会使得count变慢。

1.2 distinct

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

> db.runCommand({"distinct" : "people", "key" : "age"})

{"name":"adas", "age" : 20}
{"name":"kimin", "age" : 35}
{"name":"susan", "age" : 60}
{"name":"andy", "age" : 35}
//对age键使用distinct,会获得所有不同的年龄:
> db.runCommand({"distinct" : "people" , "key" : "age"})
{value : [20,35,60], "ok" : 1}

1.3 group

group做的聚合稍复杂一些。先选定分组所依据的键,而后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。

假设有个站点跟踪股票价格。从上网10点到下午4点每隔几分钟就更新一下某支股票的价格,并保存在MongoDB中。现在报表程序要获得进30天的收盘价格,用group就可以很容易办到。

股票的集合中包含大量形如以下文档:

{day : "2010/10/03", time : "10/3/2010 03:37:01 GMT-400" , "price" : 4.23}

想获得的结果就是每天最后的价格列表,就像这样:

[{time : "10/3/2010 03:37:01 GMT-400" , "price" : 4.23},.....]

先把集合按照天分组,然后在每一组里取包含最新时间戳的文档,将其放置到结果中就完成了。

> db.runCommand({"group" : {
   "ns" : "stocks",   //指定要进行分组的集合 
    "key" : "day",    //指定文档分组的键,所有day值相同的文档被划分到一组。
    “initial”: {"time" : 0}, //每一组reduce函数调用的初始时间,
    “$reduce” : function(doc , prev){   //每个文档都对应一次这个调用。系统会传递   
          if(doc.time > pre.time){      //两个参数:当前文档和累加文档
             prev.price = doc.price;
             prev.time = doc.time;
         }
     },
    "conditon" :{"day" : {"$gt" : "2010/09/30"}}
}})

1.4 MapReduce

MapReduce是聚合工具中的明星。count、distinct、group能做的MapReduce都能做。

 

posted on 2016-04-11 22:03  gimin  阅读(194)  评论(0)    收藏  举报