关闭

mongoDB聚合

标签: mongodb聚合
424人阅读 评论(0) 收藏 举报
分类:

1 cout.返回文档的总数量:db.dbname.count(),也可以指定查询db.dbname.count({"x":"1"})增加查询条件会使count变慢。

2 distinct用来找出给定键的所有不同的值。必须指定集合和键。db.runCommand({"distinct":"people","key":"age"}) 得到{"value":{20,35,60},"ok":1}

3 group先选定分组所依据的键,而后MongoDB就会将集合依据选定的不同分为若干组。然后通过聚合每一组的文档,产生一个结果文档。

       

想获得每天最后的价格报表。可以先把集合按照天分组,然后在每一组取包含最新时间戳的文档,将其放置到结果中

                   

"ns":"stocks"指定要分组的集合。

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

"initial":"{"time":0}"每一组reduce函数调用的初始时间,会作为初始文档传递给后续过程。每一组的所有成员都会使用这个累加器,所以改变会保留住。

"$reduce":function(doc,prev){...}每个文档都会对应一次这个调用。系统会传递两个参数:当前文档和累加器文档。本例中,想让reduce函数比较当前文档的时间和累加器

的时间。如果当前文档的时间更近,则将累加器的日期和价格替换成当前文档的值。每一组都有一个独立的累加器,所以不担心不同的日期使用同一个累加器。

还可以加上condition条件

db.runCommand({"group":{

"ns":...

"key":...

"initial":...

"reduce":...

"condition":{"day":{"$gt":"2010/09/30"}}

}})

4 完成器。用于精简从数据库传到用户的数据,这个步骤非常重要,因为group命令的输出一定要能放在单个数据库响应中。

比如说博客,每篇文章有多个标签。现在要找出每天最热的标签。可以按天分组,为每一个标签计数。

db.posts.group({

"key":{"tags":true},

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

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

for(i in doc.tags){

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

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

}else{

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

}

}

}})

结果:

           


服务器返回:

{"day":"2010/01/12","tag":"winter"},

{"day":"2010/01/13","tag":"soda"},

{"day":"2010/01/14","tag":"nosql"},

finalize能修改传递的参数也能返回新值.

5 将函数作为键使用。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4951次
    • 积分:181
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:4篇
    • 译文:1篇
    • 评论:0条
    文章分类