对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

$maxN(累加器运算符)

$maxN

返回群组内 n 个最大值元素的聚合。 如果该组包含的元素少于 n 个,$maxN 返回该组中的所有元素。

$maxN 累加器可在以下阶段使用:

注意

$maxN 的其他用途

本页介绍了 $maxN 用作 累加器 时的情况。累加器对一组输入文档返回聚合值,如总和、最大值或最小值。

您还可以在这些其他上下文中使用 $maxN:

{
$maxN:
{
input: <expression>,
n: <expression>
}
}
字段
类型
说明

input

表达式(expression)

对组中的每个元素求值的表达式。$maxN 保留最大 n 值。

n

表达式(expression)

The number of elements that $maxN returns from the group. For an example of setting n dynamically, see Set n Based on the Group Key.

$maxN 比较不同类型的值时,类型的顺序遵循 BSON 比较顺序。

$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 个文档具有有效评级,$maxN 返回 3 个值,即使 n = 4。

您可以使用 $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" 指定为 input,用于 $maxN。

  • 使用 $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 } }
] )

前面的管道:

  • 使用 $match 过滤器在 1999、2000 或 2001 发布的电影,并具有 imdb.rating 字段。

  • 使用 $group 按 year 对电影分组。

  • 将 "$imdb.rating" 指定为 input,用于 $maxN。

  • 使用 $maxN 返回每年带有 n: 3 的前三个最高评级。

  • 按年份升序对结果进行排序。

您可以根据组密钥动态地赋值 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 表达式返回 3 年 2001 的评级和所有其他年份的 1 评级。

在输出中,2001 返回三个评级,而 1999 和 2000 则各自返回一个评级。

给本页内容打分