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つだけです。