Docs Menu
Docs Home
/
データベース マニュアル
/ / /

$setDifference(集計)

$setDifference

2 つのセットを受け取り、最初のセットにのみ存在する要素を含む配列を返します。つまり、最初のセットに対する 2 番目のセットの 相対補完 を実行します。

$setDifference の構文は次のとおりです。

{ $setDifference: [ <expression1>, <expression2> ] }

引数は、それぞれが配列に変換される限り、有効なであれば何でも使用できます。 式の詳細については、「式 」を参照してください。

$setDifferenceは、配列をセットとして扱い、配列に対してセット演算を実行します。 配列に重複エントリが含まれている場合、 $setDifferenceは重複エントリを無視します。 $setDifferenceは要素の順序を無視します。

$setDifference は結果内の重複を除外して、一意のエントリのみを含む配列を出力します。出力配列内の要素の順序は指定されていません。

セットにネストされた配列要素が含まれている場合、 $setDifferenceはネストされた配列に下降 せ、最上位の配列を評価します。

結果
ノート
{ $setDifference: [
[ "a", "c" ],
[ "a", "b" ]
] }
[ "c" ]

"a" は両方の配列に存在するため、結果から削除されます。"c" は最初の配列にのみ存在します。

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

"a""c" は両方の配列に存在するため、結果から削除されます。最初の配列には、これ以上の要素は残りません。

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

"a""b" は両方の配列に存在するため、結果から削除されます。重複も削除されます。最初の配列には、これ以上の要素は残りません。

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

最初の配列の文字列 "a""b" は、ネストされた配列を含む 2 番目の配列には見つかりません。

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

最初の配列は空であるため、2 番目の配列に何があるかに関係なく、減算する要素はありません。

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

"a" は 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" ] }
] )

次の操作では、 $setDifference演算子を使用して、 flowerFieldB配列には含まれるがflowerFieldA配列には含まれない要素の配列を返します。

db.flowers.aggregate(
[
{ $project: { flowerFieldA: 1, flowerFieldB: 1, inBOnly: { $setDifference: [ "$flowerFieldB", "$flowerFieldA" ] }, _id: 0 } }
]
)

この操作は次の結果を返します。

{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "orchid", "rose", "orchid" ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "rose", "orchid", "jasmine" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ "jasmine", "rose" ], "inBOnly" : [ "jasmine" ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose" ], [ "orchid" ] ], "inBOnly" : [ [ "rose" ], [ "orchid" ] ] }
{ "flowerFieldA" : [ "rose", "orchid" ], "flowerFieldB" : [ [ "rose", "orchid" ] ], "inBOnly" : [ [ "rose", "orchid" ] ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ ], "inBOnly" : [ ] }
{ "flowerFieldA" : [ ], "flowerFieldB" : [ "rose" ], "inBOnly" : [ "rose" ] }

戻る

$second

項目一覧