定义
返回特定窗口中所有唯一值的大量。
返回的数组中元素的顺序未指定。
注意
消歧
本页介绍了用作窗口函数的 $addToSet。
您还可以在其他上下文中使用 $addToSet:
$addToSet (accumulator),它会根据可变数量的输入文档返回单个聚合值。$addToSet (update operator),向文档中的大量字段添加元素。
语法
{ $setWindowFields: { ... output: { <field>: { $addToSet: <expression> } } } }
行为
如果表达式的值是一个大量,$addToSet 会将整个大量作为单个元素追加。
如果该表达式的值为一个文档,则当数组中的另一文档与要添加的文档完全匹配时,MongoDB 便确定该文档为重复文档。具体而言,现有文档包含顺序完全相同的相同字段和值。
例子
本页上的示例使用 sample_mflix 数据集中的数据。有关如何将此数据集加载到自管理MongoDB 部署中的详细信息,请参阅加载样本数据集。如果对示例数据库进行了任何修改,则可能需要删除并重新创建数据库才能运行本页上的示例。
此示例使用 $addToSet窗口函数来展示不同电影的独特类型是如何随着时间的推移而积累的。电影按标题字母顺序排序,窗口函数跟踪电影中出现的所有独特类型,从结果设立开始一直到当前电影(包括当前电影)。
db.movies.aggregate( [ { $match: { year: 2002, genres: { $exists: true, $ne: [] } } }, { $group: { _id: { year: "$year", title: "$title", genre: { $first: "$genres" } }, } }, { $setWindowFields: { sortBy: { "_id.title": 1 }, output: { genresSeenSoFar: { $addToSet: "$_id.genre", window: { documents: [ "unbounded", "current" ] } } } } }, { $project: { _id: 0, year: "$_id.year", title: "$_id.title", genre: "$_id.genre", genresSeenSoFar: 1, uniqueGenreCount: { $size: "$genresSeenSoFar" } } }, { $limit: 8 } ] )
在示例中:
$match阶段筛选来自 2002 的具有类型信息的电影。$group阶段按年份、标题和genres大量中的第一个流派进行分组。$setWindowFields阶段使用带有unbounded到current窗口的$addToSet来累积从结果设立开始到当前文档的唯一流派。$project阶段重塑输出并计算uniqueGenreCount以显示设立大小的增长情况。$limit阶段将输出限制为 8 文档。
输出演示了 $addToSet 如何跨文档累积唯一类型。请注意,随着每部电影将其类型添加到设立中,genresSeenSoFar 会从 1 类型增长到 7 类型。第七个文档('3 Extremes II') 具有与第六个文档相同的 uniqueGenreCount,因为它的类型(恐怖)已经在设立中。这表明 $addToSet 仅添加唯一值而忽略重复值。