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 将函数作为键使用。