1. 什么是Aggregate
Aggregate是MongoDB中的一个强大的函数,它可以用来对一个集合进行数据处理,类似于SQL中的GROUP BY语句。
Aggregate通过多个管道操作符对数据进行聚合操作,并返回相应的结果。
以下是一个简单的Aggregate命令:
db.collection.aggregate([ pipeline ])
其中pipeline是一个由操作符组成的数组,这些操作符按照顺序被应用到文档流中。
在下面的小节中,我们将会一步一步地学习如何使用Aggregate命令。
2. Aggregate操作符
在Aggregate管道中,有很多操作符可以使用。
下面列出了一些常用的Aggregate操作符:
2.1 $match
$match操作符用于过滤文档流,与find()函数类似。
以下是一个简单的$match命令:
db.collection.aggregate([
{ $match : { field1 : value1, field2 : value2, ... } }
])
其中field1、field2等是要进行过滤的字段,value1、value2等是要过滤的值。
以下是一个更为复杂的$match命令:
db.collection.aggregate([
{ $match: { price: { $gt: 10, $lt: 20 } } }
])
以上命令将返回价格在10到20之间的所有文档。
2.2 $group
$group操作符将文档流中的文档根据指定的字段进行分组,并对每个组进行汇总计算。
以下是一个简单的$group命令:
db.collection.aggregate([
{ $group : { _id : "$field", count : { $sum : 1 } } }
])
其中field是要分组的字段,$sum操作符用于计算每个组的数量。
以下是一个更复杂的$group命令:
db.collection.aggregate([
{ $group : { _id : { field1: "$field1", field2: "$field2" },
count : { $sum : "$field3" } } }
])
以上命令按照field1和field2字段分组,并将每个组中的field3值求和。
2.3 $project
$project操作符用于对文档流中的文档进行重构,只包含需要的字段。
以下是一个简单的$project命令:
db.collection.aggregate([
{ $project : { field1: 1, field2: 1, _id: 0 } }
])
以上命令只返回文档中的field1和field2字段,并且不返回_id字段。
2.4 $sort
$sort操作符用于对文档流中的文档进行排序。
以下是一个简单的$sort命令:
db.collection.aggregate([
{ $sort : { field1 : 1 } }
])
以上命令根据field1字段对文档进行升序排序。
3. Aggregate示例
下面我们将使用一个示例来演示如何使用Aggregate命令。
假设我们有一个电影集合,包含以下字段:
_id:电影ID
title:电影名
year:上映年份
genre:类型
rating:评级
votes:评分人数
gross:票房
3.1 查询票房最高的电影
以下是一个查询票房最高的电影的示例:
db.movies.aggregate([
{ $sort : { gross : -1 } },
{ $limit : 1 },
{ $project : { _id : 0, title : 1 } }
])
以上命令将电影按照票房进行降序排序,然后取出第一个电影,并仅返回电影名。
3.2 查询评分最高的电影类型
以下是一个查询评分最高的电影类型的示例:
db.movies.aggregate([
{ $group : { _id : "$genre", avg_rating : { $avg : "$rating" } } },
{ $sort : { avg_rating : -1 } },
{ $limit : 1 }
])
以上命令将电影按照类型进行分组,然后计算每个组中电影的平均评分。接着,按照平均评分进行降序排序,并只返回评分最高的电影类型。
3.3 查询上映年份在1990年以后,并且评级高于8分的电影数量
以下是一个查询上映年份在1990年以后,并且评级高于8分的电影数量的示例:
db.movies.aggregate([
{ $match : { year : { $gte : 1990 }, rating : { $gt : 8 } } },
{ $group : { _id : null, count : { $sum : 1 } } },
{ $project : { _id : 0 } }
])
以上命令过滤掉上映年份早于1990年的电影和评级低于8分的电影,然后计算符合条件的电影数量。
4. 总结
本文介绍了MongoDB中非常好用的Aggregate命令及其操作符。通过这些命令和操作符的组合,可以实现复杂的数据处理和计算。