使用聚合框架可以对集合中的文档进行变换和组合,基本上,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理。这些构件包括筛选(filtering),透射(projecting),分组(grouping),排序(sorting),限制(limiting)和跳过(skipping);
管道操作符
每个操作符都会接收一连串的文档,对这些文档做一些类型转换,最后将转换后的文档作为结果传递给下一个操作符。
$match
match用于对集合文档进行刷选。
match 可以使用常规的查询操作符(
it,
gt等)。
在实际使用中,一般将$match放到管道前面,这样做有一下两个好处:
- 可以快速将不需要的文档过滤掉;
- 在分组和透射之前,$match查询可以使用索引。
$project
相对于普通的“查询”而言,
project的功能更加强大。使用
project可以从子文档中提取字段,并且对字段进行重命名。
例如,从子文档中选择自己想要的字段:
db.articles.aggregate({"$project":{"author":1,"_id":0}});
上面的查询语句的结果是只包含author字段,排除"_id"字段。
$project还有一个重要的功能,就是管道表达式(类似于MySql中的函数)
- 数学表达式:如”$add”,”$subtract”等
- 日期表达式。
- 字符串表达式
- 逻辑表达式
$group
“$group”操作符可以将文档依据特定的字段值进行分组。
例如:对用户依据state和city进行分组
db.city.aggregate({"$group":{"_id":{"state":"$state","city":"$city"}}})