sql >> Database >  >> NoSQL >> MongoDB

MongoDB onderscheiden commando

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.


  1. Moet ik MongoDB als onze hoofddatabase gebruiken, moet ik een afzonderlijke grafische database gebruiken om relaties tussen entiteiten te implementeren?

  2. Verschil tussen op documenten gebaseerde en op sleutel/waarde gebaseerde databases?

  3. Verwijzen naar een ander schema in Mongoose

  4. Mongo Aggregation:$groep en $projectarray om bezwaar te maken voor tellingen