MongoDB提供了聚合管道(aggregation pipeline)来执行聚合操作。聚合管道是一系列的数据处理阶段,每个阶段都会对输入的数据集进行某种处理,然后输出到下一个阶段。常见的聚合操作包括分组、过滤、排序、投影和计算等。
下面浅谈一下MongoDB的聚合函数。
1、$match:过滤数据,只有符合条件的文档才能进入下一阶段(类似mysql的where)。
用法示例:
db.collection.aggregate([
{ $match: { status: "A" } }
]);
解析:查询status等于A的数据。
2、$group:将集合中的文档分组,并可以进行求和、平均值等统计操作(类似mysql的group by)。
用法示例:
db.collection.aggregate([
{ $group: { _id: "$by_user", num_tutorial: { $sum: 1 } } }
]);
解析:根据_id分组统计num_tutorial的数量。
3、$sort:将输入文档排序后输出(类似mysql的order by age DESC)。
用法示例:
db.collection.aggregate([
{ $sort: { age: -1 } }
]);
解析:根据age进行倒序。
4、$limit:
限制管道的输出数量(类似mysql的limit)。
用法示例:
db.collection.aggregate([
{ $limit: 5 }
]);
解析:查询限制返回五条数据。
5、$skip:
跳过管道中的指定数量的文档(类似mysql的offset)。
用法示例:
db.collection.aggregate([
{ $skip: 5 }
]);
解析:指定跳过五条数据。
6、$unwind:
将数组类型的字段拆分成多个文档(mysql没有)。
用法示例:
db.collection.aggregate([
{ $unwind: "$tags" }
]);
解析:将对象数组tags拆分为多个对象或者将数组拆分为多个元素。
7、$project
: 修改输入文档的结构,如重命名、增加或删除字段。
用法示例:
db.collection.aggregate([
{ $project: { _id: 0, name: 1, status: 1 } }
]);
解析:0代表结果集不返回该字段,1代表结果集返回该字段,重命名示例:username:"$name",表示将name字段重命名为username。
8、$lookup
: 类似于数据库的左连接操作,用于合并两个集合。(相当于mysql的left join)
用法示例:
db.collection.aggregate([
{
$lookup:
{
from: "orders",
localField: "item_id",
foreignField: "_id",
as: "order_detail"
}
}
]);
解析:左连接orders,连接本表字段为item_id,连接表字段为_id,as为别名。
9、$count
: 计数。(相当于mysql的count(*))
用法示例:
db.collection.aggregate([
{ $count: "total" }
]);
解析:统计字段total的总量。
10、$addFields
: 添加新字段到文档中,该字段可以是静态值或者通过表达式计算得出。
用法示例:
db.collection.aggregate([
{ $addFields: { totalLower: { $toLower: "$title" } } }
]);
解析:添加一个字段到文档中。