对于 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)

$maxN 从群组中返回的元素数量。有关动态设置 n 的示例,请参阅基于组键设置 n。

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

您可以使用 $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 } }
] )

上述管道:

  • 使用 $match过滤在 1999、2000 或 2001 上映且具有 imdb.rating字段的电影。

  • 使用 $group 按 year 对电影进行群组。

  • 将 "$imdb.rating" 指定为 $maxN 的 input。

  • 使用 $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表达式返回 2001 年的 3 评级和所有其他年份的 1 评级。

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

给本页内容打分