mongodb 分组聚合查询

Posted atttitude

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb 分组聚合查询相关的知识,希望对你有一定的参考价值。

MongoDB,分组,聚合

 

使用聚合,db.集合名.aggregate… 而不是find

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。
MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。

每一个操作符(集合)都会接受一连串的文档,对这些文档做一些类型转换,最后将转换后的文档作为结果传递给下一个操作符,对于最后一个操作符,是将结果返回给客户端

//分组(这里制定了分组字段 $+字段名)
//这里可以理解为,吧lastModifyByUserCode 当作唯一标识 _id,字段count 用 $sum 计算 同一个lastModifyByUserCode出现次数

db.test.aggregate({\'$group\':{\'_id\':\'$lastModifyByUserCode\',\'count\':{\'$sum\':1}}})

 

//根据多个字段分组

db.test.aggregate({$group:{_id:{lastModifyByUserCode:\'$lastModifyByUserCode\',createTime:\'$createTime\'}}})

 

//显示其他字段(必须使用聚合[$sum,$avg,$first,$last,$max,$min,$push,$addToSet,$stdDevPop,$stdDevSamp])

db.test.aggregate({\'$group\':{\'_id\':\'$lastModifyByUserCode\',\'count\':{\'$sum\':1},\'createTime\':{\'$first\':"$createTime"}}})

 

//投射,可以对字段重命名,可以创建字段副本(注意:在对字段重命名时,MongoDB并不会记录字段的历史名称,因此如果在"orginalfieldname"字段上有一个索引,聚合框架无法在下面的排序操作中使用这个索引,所以,应该尽量在修改字段名称之前使用索引)

db.test.aggregate({$project:{createTime2:\'$createTime\',createTime3:\'$createTime\',_id:0}})

 

$match 用于对文档集合进行筛选,支持find一样的筛选条件,不能在$match中使用地理空间操作符,(尽量把$match放在多个聚合中的第一个,这样可以有效利用索引)

而且根据官方文档,如果在$match使用了全文索引,后面跟着的聚合就不用再使用$text

 

以上是关于mongodb 分组聚合查询的主要内容,如果未能解决你的问题,请参考以下文章

mongodb 分组聚合查询

MongoDB聚合查询返回集合中每年每月的条目总数,按位置值分组

详细教程一文参透MongoDB聚合查询

MongoDB高级查询多级分组聚合及时间计算应用实践案例

在mongodb聚合管道中将毫秒转换为日期以进行分组?

mongodb 聚合操作