I MongoDB är distinct
aggregeringskommandot hittar de distinkta värdena för ett specificerat fält över en enda samling.
Den returnerar ett dokument som innehåller en uppsättning av de distinkta värdena, samt ett inbäddat dokument med frågestatistik och frågeplanen.
Distinkta värden är de med borttagna redundanta dubbletter. Distinkta värden är unika värden. Om du till exempel har 2 eller 3 dokument med samma värde, visas distinct
kommandot returnerar bara ett värde.
Det finns också en db.collection.distinct()
metod, som är en skalinpackningsmetod för distinct
kommando.
Exempel
Anta att vi har en samling som heter pets
med följande dokument.
{ "_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 }
Vi kan använda distinct
kommando för att returnera de distinkta husdjurstyperna.
Den distinct
kommandot accepterar samlingen som det första fältet och nyckeln som det andra. Nyckeln är fältet för vilket distinkta värden ska returneras.
db.runCommand ( { distinct: "pets", key: "type" } )
Resultat:
{ "values" : [ "Bat", "Cat", "Dog" ], "ok" : 1 }
I det här exemplet, även om det finns fyra hundar och två katter i samlingen, innehåller arrayen bara en av varje. Den distinct
kommandot tog bort dubblettvärdena.
Originaldokumentet har bara en bat och så den distinct
kommandot ändrar inte det – det fanns inga dubbletter av värden att dedupera.
Inbäddade dokument
Du kan använda punktnotation för att få distinkta värden från ett inbäddat fält
Anta att vi har en samling som heter products
som innehåller följande dokument:
{ "_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" ] }
Vi kan använda följande fråga för att returnera distinkta värden för produktnamnen.
db.runCommand ( { distinct: "products", key: "product.name" } )
Resultat:
{ "values" : [ "Cap", "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
Vi kan göra samma sak för color
fältet.
db.runCommand ( { distinct: "products", key: "product.color" } )
Resultat:
{ "values" : [ "Brown", "Green", "Purple", "White" ], "ok" : 1 }
Hämta distinkta värden från en matris
Så här använder du distinct
kommando för att få de distinkta värdena från ovanstående array.
db.runCommand ( { distinct: "products", key: "sizes" } )
Resultat:
{ "values" : [ "L", "M", "S", "XL", "XS" ], "ok" : 1 }
Använd distinct
med en fråga
Du kan ge en fråga för att ange de dokument från vilka de distinkta värdena ska hämtas. För att göra detta, lägg till frågan efter nyckeln.
Exempel:
db.runCommand ( {
distinct: "products",
key: "product.name",
query: { "sizes": "S" }
} )
Resultat:
{ "values" : [ "Shirt", "Shoes", "Shorts" ], "ok" : 1 }
Mer information
Den distinct
kommandot accepterar även andra fält, såsom comment
, readConcern
och collation
(vilket låter dig ange språkspecifika regler för strängjämförelse, såsom regler för skiftläge och accenttecken).
Se MongoDB-dokumentationen för mer information.