In MongoDB, de distinct
aggregation-opdracht vindt de afzonderlijke waarden voor een opgegeven veld in een enkele verzameling.
Het retourneert een document dat een array van de verschillende waarden bevat, evenals een ingesloten document met querystatistieken en het queryplan.
Onderscheidende waarden zijn die waarbij overtollige duplicaten zijn verwijderd. Verschillende waarden zijn unieke waarden. Als u bijvoorbeeld 2 of 3 documenten met dezelfde waarde heeft, wordt de distinct
commando retourneert slechts één waarde.
Er is ook een db.collection.distinct()
methode, wat een shell-wrappermethode is voor de distinct
commando.
Voorbeeld
Stel dat we een verzameling hebben met de naam pets
met de volgende documenten.
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 } { "_id" : 6, "name" : "Fetch", "type" : "Dog", "weight" : 17 } { "_id" : 7, "name" : "Jake", "type" : "Dog", "weight" : 30 }
We kunnen de distinct
. gebruiken commando om de verschillende soorten huisdieren terug te geven.
De distinct
opdracht accepteert de verzameling als het eerste veld en de sleutel als het tweede. De sleutel is het veld waarvoor afzonderlijke waarden moeten worden geretourneerd.
db.runCommand ( { distinct: "pets", key: "type" } )
Resultaat:
{ "values" : [ "Bat", "Cat", "Dog" ], "ok" : 1 }
In dit voorbeeld, hoewel er vier honden en twee katten in de verzameling zijn, bevat de array slechts één van elk. De distinct
opdracht heeft de dubbele waarden verwijderd.
Het originele document heeft slechts één vleermuis en dus de distinct
commando verandert daar niets aan – er waren geen dubbele waarden om te ontdubbelen.
Ingesloten documenten
U kunt puntnotatie gebruiken om verschillende waarden uit een ingesloten veld te halen
Stel dat we een verzameling hebben met de naam products
die de volgende documenten bevat:
{ "_id" : 1, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : { "name" : "Shirt", "color" : "Green" }, "sizes" : [ "S", "M", "XL" ] } { "_id" : 3, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 4, "product" : { "name" : "Shorts", "color" : "Green" }, "sizes" : [ "M", "XS" ] } { "_id" : 5, "product" : { "name" : "Shorts", "color" : "Brown" }, "sizes" : [ "S", "M" ] } { "_id" : 6, "product" : { "name" : "Cap", "color" : "Purple" }, "sizes" : [ "M" ] } { "_id" : 7, "product" : { "name" : "Shoes", "color" : "Brown" }, "sizes" : [ "S", "M", "L" ] } { "_id" : 8, "product" : { "name" : "Shirt", "color" : "White" }, "sizes" : [ "M", "L", "XL" ] } { "_id" : 9, "product" : { "name" : "Cap", "color" : "Green" }, "sizes" : [ "M", "L" ] }
We kunnen de volgende query gebruiken om verschillende waarden voor de productnamen te retourneren.
db.runCommand ( { distinct: "products", key: "product.name" } )
Resultaat:
{ "values" : [ "Cap", "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
We kunnen hetzelfde doen voor de color
veld.
db.runCommand ( { distinct: "products", key: "product.color" } )
Resultaat:
{ "values" : [ "Brown", "Green", "Purple", "White" ], "ok" : 1 }
Haal verschillende waarden uit een array
Zo gebruikt u de distinct
commando om de verschillende waarden uit de bovenstaande array te halen.
db.runCommand ( { distinct: "products", key: "sizes" } )
Resultaat:
{ "values" : [ "L", "M", "S", "XL", "XS" ], "ok" : 1 }
Gebruik distinct
met een zoekopdracht
U kunt een query opgeven om de documenten op te geven waaruit de afzonderlijke waarden moeten worden opgehaald. Voeg hiervoor de query toe na de sleutel.
Voorbeeld:
db.runCommand ( {
distinct: "products",
key: "product.name",
query: { "sizes": "S" }
} )
Resultaat:
{ "values" : [ "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
Meer informatie
De distinct
commando accepteert ook andere velden, zoals comment
, readConcern
, en collation
(waarmee u taalspecifieke regels kunt specificeren voor het vergelijken van tekenreeksen, zoals regels voor hoofdletters en accenttekens).
Zie de MongoDB-documentatie voor meer informatie.