MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Entfernen Sie Duplikate, wenn Sie $unionWith in MongoDB verwenden

In MongoDB die $unionWith Aggregation-Pipeline-Stufe führt eine Vereinigung von zwei Sammlungen durch und schließt Duplikate ein.

Dies verhält sich ähnlich wie UNION ALL von SQL , die auch Duplikate enthält. Verwenden Sie dagegen nur UNION (also ohne den ALL )in SQL entfernt Duplikate.

In MongoDB haben wir nicht die Möglichkeit, $unionWith ALL anzugeben oder ähnliches, also müssen wir Duplikate auf andere Weise reduzieren.

In MongoDB können wir Duplikate mithilfe von $group entfernen Bühne.

Beispiel

Angenommen, wir fügen die folgenden Dokumente in zwei Sammlungen ein; eine namens cats und eine andere namens 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 }
    ]) 

Angenommen, wir führen die folgende Abfrage aus, um alle Namen aus beiden Sammlungen zurückzugeben:

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} }
] ) 

Ergebnis:

{ "name" :"Fluffy" }{ "name" :"Scratch" }{ "name" :"Miau" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffy" }

Wir können sehen, dass der Name Fluffy zweimal vorkommt. Das liegt daran, dass es zwei Fluffys in unseren Kollektionen gibt – eine in den cats Sammlung und eine in den dogs Sammlung.

Dies ist in Ordnung, wenn wir gerne doppelte Werte haben. Aber was, wenn wir es nicht tun? Was ist, wenn wir nur eine Liste unterschiedlicher Namen aus beiden Sammlungen wollen?

Dort befindet sich die $group Stufe kommt herein.

Wir können die $group hinzufügen Stufe zum name Feld, sodass es so aussieht:

db.cats.aggregate( [
   { $project: { name: 1, _id: 0 } },
   { $unionWith: { coll: "dogs", pipeline: [ { $project: { name: 1, _id: 0 } } ]} },
   { $group: { _id: "$name" } }
] ) 

Ergebnis:

{ "_id" :"Miau" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffy" } 

Dieses Mal bekommen wir nur 5 statt 6 Dokumente und es gibt nur einen Fluffy.