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都能做。
浙公网安备 33010602011771号