Docs 菜单
Docs 主页
/
数据库手册
/ / /

$setUnion

接受两个或多个数组并返回一个大量,其中包含出现在任何输入大量中的唯一元素。$setUnion 可用作聚合累加器或大量操作符。

$setUnion

$setUnion 在这些阶段可用作累加器:

  • $bucket

  • $bucketAuto

  • $group

  • $setWindowFields

当用作聚合累加器时,$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 的语法如下:

{
$setUnion: [ <expression1>, <expression2>, ... ]
}

$setUnion对数组执行集合操作,将数组视为集合。如果数组包含重复条目,$setUnion 会忽略重复条目。$setUnion 会忽略元素的顺序。

$setUnion 过滤掉结果中的重复项,以输出仅包含唯一条目的大量。输出大量中元素的顺序未指定。

参数可以是任何有效的表达式,只要它们都解析为一个数组即可。有关表达式的更多信息,请参阅表达式

如果设立包含嵌套大量元素,则 $setUnion 不会降级到嵌套大量,而是在顶层计算大量。

例子
结果
注意
{ $setUnion: [
[ "a", "c" ],
[ "a", "b" ]
] }
[ "a", "c", "b" ]

两个数组中的所有元素都会被合并,并删除重复元素。

{ $setUnion: [
[ "a", "c" ],
[ "a", "b", "c" ]
] }
[ "a", "c", "b" ]

两个数组中的所有元素都会被合并,并删除重复元素。

{ $setUnion: [
[ "a", "b", "a" ],
[ "b", "a" ]
] }
[ "a", "b" ]

两个数组中的所有元素都会被合并,并删除重复元素。

{ $setUnion: [
[ "a", "b" ],
[ [ "a", "b" ] ]
] }
[ "a", "b", [ "a", "b" ] ]

结果包括作为单独字符串元素的 "a""b" 以及作为唯一元素的大量[ "a", "b" ]

{ $setUnion: [
[ ],
[ "a", "b" ]
] }
[ "a", "b" ]

结果由第二个大量中的唯一元素组成,因为第一个大量为空。

{ $setUnion: [
[ "a", "a" ],
[ "a", "b" ]
] }
[ "a", "b" ]

两个数组中的所有元素都会被合并,并删除重复元素。

考虑包含以下文档的 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 不保证输出大量中元素的顺序。

后退

$setIsSubset

在此页面上