定义
接受两个或多个数组并返回一个大量,其中包含出现在任何输入大量中的唯一元素。$setUnion
可用作聚合累加器或大量操作符。
聚合累加器
$setUnion
在这些阶段可用作累加器:
语法
当用作聚合累加器时,$setUnion
具有以下语法:
{ $setUnion: "<array field>" }
行为
$setUnion
对数组执行集合操作,将数组视为集合。如果数组包含重复条目,$setUnion
会忽略重复条目。$setUnion
会忽略元素的顺序。
$setUnion
过滤掉结果中的重复项,以输出仅包含唯一条目的大量。输出大量中元素的顺序未指定。
如果设立包含嵌套大量元素,则 $setUnion
不会降级到嵌套大量,而是在顶层计算大量。
为 null
或解析为 null
的参数包含在结果中。结果不包含引用缺失字段的参数。
例子
使用以下文档创建名为 sales
的集合:
db.sales.insertMany( [ { _id: 1, items: [ "laptop", "tablet" ], location: "NYC" }, { _id: 2, items: [ "phone", "tablet" ], location: "NYC" }, { _id: 3, location: "NYC" }, { _id: 4, items: [ "desktop", { "accessories": [ "mouse", "keyboard"] } ], location: "NYC" } ] )
此示例展示了如何将 $setUnion
用作累加器。此示例在按 location
字段分组时会累加 items
数组中的所有唯一元素:
db.sales.aggregate( [ { $group: { _id: "$location", array: { "$setUnion": "$items" } } } ] )
操作返回以下结果:
[ { "_id": "NYC", "array": [ "laptop", "tablet", "phone", "desktop", { "accessories": [ "mouse", "keyboard"] } ] } ]
数组操作符
语法
作为数组操作符使用时,$setUnion
的语法如下:
{ $setUnion: [ <expression1>, <expression2>, ... ] }
行为
$setUnion
对数组执行集合操作,将数组视为集合。如果数组包含重复条目,$setUnion
会忽略重复条目。$setUnion
会忽略元素的顺序。
$setUnion
过滤掉结果中的重复项,以输出仅包含唯一条目的大量。输出大量中元素的顺序未指定。
参数可以是任何有效的表达式,只要它们都解析为一个数组即可。有关表达式的更多信息,请参阅表达式。
如果设立包含嵌套大量元素,则 $setUnion
不会降级到嵌套大量,而是在顶层计算大量。
例子 | 结果 | 注意 | |||||
---|---|---|---|---|---|---|---|
|
| 两个数组中的所有元素都会被合并,并删除重复元素。 | |||||
|
| 两个数组中的所有元素都会被合并,并删除重复元素。 | |||||
|
| 两个数组中的所有元素都会被合并,并删除重复元素。 | |||||
|
| 结果包括作为单独字符串元素的 | |||||
|
| 结果由第二个大量中的唯一元素组成,因为第一个大量为空。 | |||||
|
| 两个数组中的所有元素都会被合并,并删除重复元素。 |
例子
考虑包含以下文档的 flowers
集合:
db.flowers.insertMany( [ { "_id" : 1, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ] }, { "_id" : 2, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ] }, { "_id" : 3, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ] }, { "_id" : 4, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ] }, { "_id" : 5, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ] }, { "_id" : 6, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ] }, { "_id" : 7, "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ] }, { "_id" : 8, "flowerFieldA" : [ ], "flowerFieldB" : [ ] }, { "_id" : 9, "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ] } ] )
以下操作使用 $setUnion
操作符返回在 flowerFieldA
数组或/和 flowerFieldB
数组中找到的元素数组:
db.flowers.aggregate( [ { $project: { flowerFieldA:1, flowerFieldB: 1, allValues: { $setUnion: [ "$flowerFieldA", "$flowerFieldB" ] }, _id: 0 } } ] )
操作返回以下结果:
{ "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "rose", "orchid" ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "orchid", "rose", "orchid" ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "rose", "orchid", "jasmine" ], "allValues": [ "orchid", "rose", "jasmine" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ "jasmine", "rose" ], "allValues": [ "orchid", "rose", "jasmine" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ ], "allValues": [ "orchid", "rose" ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ [ "rose" ], [ "orchid" ] ], "allValues": [ "orchid", "rose", [ "rose" ], [ "orchid" ] ] } { "flowerFieldA": [ "rose", "orchid" ], "flowerFieldB": [ [ "rose", "orchid" ] ], "allValues": [ "orchid", "rose", [ "rose", "orchid" ] ] } { "flowerFieldA": [ ], "flowerFieldB": [ ], "allValues": [ ] } { "flowerFieldA": [ ], "flowerFieldB": [ "rose" ], "allValues": [ "rose" ] }
限制
$setUnion
仅支持数组和解析为大量的表达式。$setUnion
不保证输出大量中元素的顺序。