MongoDBでは、$unionWith 集約パイプラインステージは、2つのコレクションの結合を実行し、重複が含まれます。
これは、SQLのUNION ALLと同じように動作します 、重複も含まれます。対照的に、UNIONだけを使用する (つまり、ALLなし )SQLで重複を削除します。
MongoDBでは、$unionWith ALLを指定するオプションはありません。 または同様のものであるため、別の方法で重複を減らす必要があります。
MongoDBでは、$groupを使用して重複を削除できます ステージ。
例
次のドキュメントを2つのコレクションに挿入するとします。 catsと呼ばれるもの もう1つはdogsと呼ばれます :
db.cats.insertMany([
{ _id: 1, name: "Fluffy", type: "Cat", weight: 5 },
{ _id: 2, name: "Scratch", type: "Cat", weight: 3 },
{ _id: 3, name: "Meow", type: "Cat", weight: 7 }
])
db.dogs.insertMany([
{ _id: 1, name: "Wag", type: "Dog", weight: 20 },
{ _id: 2, name: "Bark", type: "Dog", weight: 10 },
{ _id: 3, name: "Fluffy", type: "Dog", weight: 40 }
]) そして、次のクエリを実行して、両方のコレクションからすべての名前を返すとします。
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] ) 結果:
{ "name" : "Fluffy" }
{ "name" : "Scratch" }
{ "name" : "Meow" }
{ "name" : "Wag" }
{ "name" : "Bark" }
{ "name" : "Fluffy" }
Fluffyという名前が2回表示されていることがわかります。これは、コレクションに2つのFluffysが含まれているためです。1つはcatsにあります。 コレクションとdogsの1つ コレクション。
値が重複していれば問題ありません。しかし、そうでない場合はどうなりますか?両方のコレクションからの個別の名前のリストのみが必要な場合はどうなりますか?
ここで$group ステージが入ります。
$groupを追加できます nameへのステージ フィールド、次のようになります:
db.cats.aggregate( [
{ $project: { name: 1, _id: 0 } },
{ $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
{ $group: { _id: "$name" } }
] ) 結果:
{ "_id" : "Meow" }
{ "_id" : "Bark" }
{ "_id" : "Scratch" }
{ "_id" : "Wag" }
{ "_id" : "Fluffy" } 今回は、6つではなく5つのドキュメントしか取得できず、Fluffyは1つだけです。