对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
See how MongoDB 9.0 delivers up to 2x higher throughput.
MongoDB Branding Shape
Register now >
Docs 菜单

$push(窗口函数)

$push

返回将表达式应用于窗口中的每个文档所产生的所有值(包括重复值)的大量。

注意

消歧

本页介绍了用作窗口函数的 $push。

您还可以在其他上下文中使用 $push:

{
$setWindowFields: {
...
output: {
<field>: {
$push: <expression>
}
}
}
}

$push 包括窗口中的所有值,包括重复项。输出大量中元素的顺序与 $setWindowFields sortBy字段中指定的排序顺序相对应。

本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。

此示例使用 $push窗口函数构建2002 中电影类型的运行列表。对于每部电影,$push 会将电影的主节点 (primary node in the replica set)类型添加到 genresSeenSoFar,并保留包括重复项在内的所有值。

db.movies.aggregate( [
{
$match: {
year: 2002,
genres: { $exists: true, $ne: [] }
}
},
{
$addFields: {
primaryGenre: { $first: "$genres" }
}
},
{
$setWindowFields: {
sortBy: { title: 1 },
output: {
genresSeenSoFar: {
$push: "$primaryGenre",
window: {
documents: [ "unbounded", "current" ]
}
}
}
}
},
{
$project: {
_id: 0,
genresSeenSoFar: "$genresSeenSoFar",
year: "$year",
title: "$title",
genre: "$primaryGenre",
totalGenreCount: { $size: "$genresSeenSoFar" }
}
},
{
$limit: 8
}
] )

在示例中:

  • $match 阶段筛选来自 2002 的具有类型信息的电影。

  • $addFields 阶段添加一个 primaryGenre字段,其中包含 genres大量中的第一个元素。

  • $setWindowFields 阶段使用带有 unbounded 到 current窗口的$push 来累积从结果设立开始到当前文档的所有类型。

  • $project 阶段会重塑输出并计算 totalGenreCount,以显示大量如何随每个文档而增长。

  • $limit 阶段将输出限制为 8 文档,以提高可读性。

totalGenreCount 每个文档的 值都加 1。第七份文档('3 Extremes II') 的类型为 Horror,该类型已经在大量中,因此 Horror 在 genresSeenSoFar 中出现了两次。这表明 $push 包含重复值,而 $addToSet 仅添加唯一值。

给本页内容打分