定義
2 つ以上の配列を受け取り、任意の入力配列に現れる一意の要素を含む 1 つの配列を返します。$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
はネストされた配列に下降 せず 、最上位の配列を評価します。
例 | 結果 | ノート | |||||
---|---|---|---|---|---|---|---|
|
| 両方の配列のすべての要素が結合され、重複する要素が削除されます。 | |||||
|
| 両方の配列のすべての要素が結合され、重複する要素が削除されます。 | |||||
|
| 両方の配列のすべての要素が結合され、重複する要素が削除されます。 | |||||
|
| 結果には、個々の string 要素として | |||||
|
| 最初の配列が空であるため、結果は 2 番目の配列の一意の要素で構成されています。 | |||||
|
| 両方の配列のすべての要素が結合され、重複する要素が削除されます。 |
例
以下のドキュメントを持つ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
は、出力配列内の要素の順序を保証しません。