定义
返回所有值的数组,其中包含将表达式应用到群组中每个文档后产生的结果。
$push 累加器可在以下阶段使用:
注意
消歧
本页介绍了 $push 用作 累加器 时的情况。累加器返回跨一组输入文档的聚合值。
您还可以在这些其他上下文中使用 $push:
$push (window function),用于$setWindowFields阶段中,从特定窗口中的文档返回所有值的数组。$push (update operator), 在文档中向数组字段添加值。
语法
{ $push: <expression> }有关表达式的更多信息,请参阅表达式。
行为
当将 $push 用作累加器时,进入管道的文档顺序决定了输出数组中的文档顺序。为了保证采用所定义的顺序,将 $sort 阶段放在 $group 阶段之前。
限制
$push 累加器无法将临时文件写入磁盘。internalQueryMaxPushBytes 服务器参数控制 $push 内存限制,如果累积的数组超过该限制,即使 allowDiskUse 为 true,MongoDB 也会返回错误。默认情况下,该参数为 104857600 字节(100 兆字节)。您可以使用 setParameter 命令在运行时提高限制,最高可达 2147483647 字节。
有关聚合内存限制的更多信息,请参阅聚合管道限制。
例子
本页上的示例使用来自 sample_mflix 数据集的数据。有关如何将此数据集加载到您的自管理 MongoDB 部署中的详细信息,请参阅 加载示例数据集。如果您对示例数据库进行了任何修改,您可能需要删除并重新创建数据库,才能运行此页面上的示例。
以下操作按主管对电影进行分组,并使用 $push 累加器收集由该主管执导的每部电影的主要类型。
db.movies.aggregate( [ { $match: { year: { $gte: 2010, $lte: 2015 }, genres: { $exists: true, $ne: [] }, directors: { $exists: true, $ne: [] } } }, { $unwind: "$directors" }, { $group: { _id: "$directors", genres: { $push: { $first: "$genres" } } } }, { $sort: { _id: 1 } }, { $limit: 5 }] )前面的管道:
使用
$match过滤器出 2010-2015 年的电影,并具有类型和主管信息。使用
$unwind为directors数组中的每个主管创建单独的文档。按主管对结果文档进行分组,并使用
$push收集每部电影的主要类型。按照主管姓名的字母顺序对结果进行排序。
将输出限制为五位主管。
在输出中,A.R. Murugadoss 列出了两次 Action,因为他们执导了两部以 Action 为主要类型的电影。这表明 $push 包含重复值,与 $addToSet 不同,后者返回独特值的数组。