定义
$maxN累加器可在以下阶段使用:
注意
$maxN 的其他用途
本页描述了用作累加器时的 $maxN。累加器返回一群组输入文档的聚合值,如总和、最大值或最小值。
您还可以在其他上下文中使用 $maxN:
$maxN (window function),在$setWindowFields阶段用于返回特定窗口中文档的最大n值。
语法
{ $maxN: { input: <expression>, n: <expression> } }
字段 | 类型 | 说明 |
|---|---|---|
| 表达式(expression) | 该表达式对群组中的每个元素进行计算。 |
| 表达式(expression) |
|
行为
结果类型
当 $maxN 比较不同类型的值时,类型的排序遵循BSON比较顺序。
Null 和缺失值
$maxN 过滤掉空值和缺失值。
以下聚合演示了 $maxN 如何处理空值和缺失值:
db.aggregate( [ { $documents: [ { title: "Fight Club", genre: "Drama", rating: 8.9 }, { title: "The Matrix", genre: "Drama", rating: 8.7 }, { title: "The Green Mile", genre: "Drama", rating: 8.5 }, { title: "Magnolia", genre: "Drama" }, { title: "Dogma", genre: "Drama", rating: null } ] }, { $group: { _id: "$genre", topFourRatings: { $maxN: { input: "$rating", n: 4 } } } } ] )
[ { _id: 'Drama', topFourRatings: [ 8.9, 8.7, 8.5 ] } ]
在本例中:
$documents创建包含电影评级的字面文档。$group按genre对文档进行分组。此示例只有一个genre、Drama。Magnolia缺少rating,且Dogma的rating为空。这两个值都被过滤掉。由于只有 3 文档具有有效评级,因此即使
n = 4,$maxN也会返回 3 值。
$maxN 和 $topN 累加器的比较
您可以使用 $maxN 或 $topN 返回群组中排名最高的 n 元素。两者之间的选择取决于输入文档是否已经排序。
如果输入文档已排序,则使用
$maxN返回最大n值。如果需要同时排序和选择前
n元素,请使用$topN通过单个累加器来完成这两项操作。
示例
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
查找一年内评分最高的三部电影
您可以使用 $maxN累加器查找一年内上映的电影的 IMDb 评级最高的三部。
db.movies.aggregate( [ { $match: { year: 1999, "imdb.rating": { $exists: true } } }, { $group: { _id: 1999, topThreeRatings: { $maxN: { input: "$imdb.rating", n: 3 } } } } ] )
上述管道:
使用
$match过滤在1999中上映且具有imdb.rating字段的电影。使用
_id: 1999将所有匹配文档分组到一个群组中。将
"$imdb.rating"指定为$maxN的input。使用
$maxN返回n: 3的三个最高评分。
查找多年来评分最高的三部电影
您可以使用 $maxN累加器查找一设立年份中每年评分最高的三部电影。
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2000, 2001 ] }, "imdb.rating": { $exists: true } } }, { $group: { _id: "$year", topThreeRatings: { $maxN: { input: "$imdb.rating", n: 3 } } } }, { $sort: { _id: 1 } } ] )
上述管道:
根据组键设置 n
您可以根据群组键动态分配 n 的值。在此示例中,$cond表达式使用 year字段来更改 n 的值:
db.movies.aggregate( [ { $match: { year: { $in: [ 1999, 2000, 2001 ] }, "imdb.rating": { $exists: true } } }, { $group: { _id: { year: "$year" }, topRatedMovies: { $maxN: { input: "$imdb.rating", n: { $cond: { if: { $eq: [ "$year", 2001 ] }, then: 3, else: 1 } } } } } }, { $sort: { "_id.year": 1 } } ] )
上述管道:
筛选在
1999、2000或2001上映且具有imdb.rating字段的电影。按
year对电影进行分组。使用
$cond表达式返回2001年的3评级和所有其他年份的1评级。
在输出中,2001 返回三个评级,而 1999 和 2000 各返回一个评级。