定义
返回窗口中大量值中唯一元素的大量。
8.1版本新增。
注意
消歧
本页介绍了用作窗口函数的 $setUnion。
您还可以在其他上下文中使用 $setUnion:
$setUnion (accumulator),返回一群组文档中大量值中唯一元素的单个大量。$setUnion (expression),它将两个或多个数组组合成一个由唯一元素组成的大量。
语法
{ $setWindowFields: { ... output: { <field>: { $setUnion: <array field> } } } }
行为
$setUnion 对数组执行设立操作,将数组视为集合。如果大量包含重复条目,$setUnion 将忽略重复条目。 $setUnion 忽略元素的顺序。
$setUnion 过滤掉结果中的重复项,以输出仅包含唯一条目的大量。输出大量中元素的顺序未指定。
如果设立包含嵌套大量元素,则 $setUnion 不会降级到嵌套大量,而是在顶层计算大量。
要了解 $setUnion 如何处理嵌套大量元素,请参阅 $setUnion (expression) 部分中的示例。
为 null 或解析为 null 的参数包含在结果中。结果不包含引用缺失字段的参数。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
此示例使用 $setWindowFields 来显示导演电影作品中的类型如何随着时间的推移而累积。每个文档接收从最早的电影到当前电影的唯一类型。
db.movies.aggregate( [ { $match: { directors: "Christopher Nolan" } }, { $setWindowFields: { sortBy: { year: 1 }, output: { genresSoFar: { $setUnion: "$genres", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, title: 1, year: 1, genres: 1, genresSoFar: 1 } } ] )
上述管道:
使用
$match过滤由 Christopher Nolan 执导的电影。使用
$setWindowFields按year对电影进行排序,并将$setUnion应用[ "unbounded", "current" ]文档窗口中的genres字段。genresSoFar字段保存从按排序顺序排列的第一部电影到当前电影的唯一类型。使用
$project在输出中包含title、year、genres和genresSoFar。
genresSoFar大量随着每部电影提供尚未出现的类型而增长。 The Dark Knight Rises 和 Interstellar 没有添加新的类型,因此它们的窗口返回与 Inception 相同的设立。