sql >> Databasteknik >  >> NoSQL >> MongoDB

Ta bort dubbletter när du använder $unionWith i MongoDB

I MongoDB, $unionWith aggregeringspipelinesteget utför en sammanslutning av två samlingar, och det inkluderar dubbletter.

Detta beter sig på liknande sätt som SQLs UNION ALL , som även inkluderar dubbletter. Däremot använder du bara UNION (dvs utan ALL ) i SQL tar bort dubbletter.

I MongoDB har vi inte möjlighet att ange $unionWith ALL eller liknande, så vi måste minska dubbletter på annat sätt.

I MongoDB kan vi ta bort dubbletter genom att använda $group skede.

Exempel

Anta att vi infogar följande dokument i två samlingar; en som heter cats och en annan som heter 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 }
    ]) 

Och anta att vi kör följande fråga för att returnera alla namn från båda samlingarna:

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

Resultat:

{ "name" :"Fluffig" }{ "name" :"Scratch" }{ "name" :"Mjau" }{ "name" :"Wag" }{ "name" :"Bark" }{ " name" :"Fluffig" }

Vi kan se att namnet Fluffy förekommer två gånger. Detta beror på att det finns två Fluffys i våra samlingar – en i cats samling och en i dogs samling.

Det här är bra om vi är glada över att ha dubbletter av värden. Men vad händer om vi inte gör det? Tänk om vi bara vill ha en lista med distinkta namn från båda samlingarna?

Det är där $group scenen kommer in.

Vi kan lägga till $group steg till name fältet, så att det ser ut så här:

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

Resultat:

{ "_id" :"Mjau" }{ "_id" :"Bark" }{ "_id" :"Scratch" }{ "_id" :"Wag" }{ "_id" :"Fluffig" } 

Den här gången får vi bara 5 dokument istället för 6, och det finns bara en Fluffy.


  1. Använder du Active Record-generatorer efter Mongoid-installation?

  2. node.js databas

  3. MongoDB samlad fråga med PHP-drivrutin

  4. Kan jag ansluta direkt till en Redis-server från JavaScript som körs i en webbläsare?