一、聚合管道(Aggregation Pipeline)
使用聚合管道可以对集合中的文档进行变换和组合。
1.$match
//获取所有状态为A的数据
db.orders.aggregate([{$match:{status:"A"}}])
实际项目中:表的关联查询,数据统计。
2.管道操作符
管道操作符 |
Description |
$project |
增加,删除,重命名字段 |
$match |
条件匹配。只满足条件的文档才能进入下一阶段 |
$limit |
限制结果的数量 |
$skip |
跳过文档的数量 |
$sort |
条件排序 |
$group |
条件组合结果 |
$lookup |
$lookup操作符 用以引入其他集合的数据 |
3.SQL和NOSQL对比
WHERE |
$match |
GROUP BY |
$group |
HAVING |
$match |
SELECT |
$project |
ORDER BY |
$sort |
LIMIT |
$limit |
SUM() |
$sum |
COUNT() |
$sum |
join |
$lookup |
4.管道表达式
参考文档
表达式 |
描述 |
实例 |
$sum |
计算总和。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$sum : “$likes”}}}]) |
$avg |
计算平均值 |
db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$avg : “$likes”}}}]) |
$min |
获取集合中所有文档对应值得最小值。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$min : “$likes”}}}]) |
$max |
获取集合中所有文档对应值得最大值。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, num_tutorial : {$max : “$likes”}}}]) |
$push |
在结果文档中插入值到一个数组中。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$push: “$url”}}}]) |
$addToSet |
在结果文档中插入值到一个数组中,但不创建副本。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, url : {$addToSet : “$url”}}}]) |
$first |
根据资源文档的排序获取第一个文档数据。 |
db.mycol.aggregate([{$group : {_id : “$by_user”, first_url : {$first : “$url”}}}]) |
$last |
根据资源文档的排序获取最后一个文档数据 |
db.mycol.aggregate([{$group : {_id : “$by_user”, last_url : {$last : “$url”}}}]) |