sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB findOne()

I MongoDB er db.collection.findOne() metoden returnerer ét dokument, der opfylder de angivne forespørgselskriterier på samlingen eller visningen.

collection del er navnet på samlingen eller visningen, der skal søges i.

findOne() ligner find() , bortset fra at findOne() returnerer kun det første dokument, der matcher filterkriterierne, i henhold til den naturlige rækkefølge, som afspejler rækkefølgen af ​​dokumenter på disken.

find() metode på den anden side, returnerer alle matchende dokumenter.

Også findOne() returnerer det faktiske dokument, hvorimod find() returnerer kun en markør til hvert dokument. Derfor kan du ikke anvende markørmetoder på findOne() som du kan med find() .

Eksempel

Antag, at vi har en samling kaldet pets med følgende dokumenter:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "navn" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 } 

Vi kan bruge findOne() for at returnere ét dokument.

db.pets.findOne() 

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "vægt" :20 }

Her søgte vi gennem alle dokumenter i pets kollektion. Vi ved, at dette søgte i alle dokumenter, fordi vi ikke angav nogen filtreringskriterier. Vi kom ikke engang med nogen argumenter.

Når kaldet uden argumenter, findOne() søger i alle dokumenter fra en samling og returnerer alle felter for det matchende dokument.

En anden måde at gøre ovenstående på er sådan her:

db.pets.findOne({}) 

I dette tilfælde sender vi et tomt dokument.

Ved at tilføje til dette tomme dokument, kan vi begynde at filtrere resultaterne.

Skriv en forespørgsel

Den faktiske syntaks for findOne() går sådan her:

db.collection.findOne(query, projection) 

Det betyder, at du kan sende en forespørgsel som det første argument og en projektion som det andet.

Hvis du sender en forespørgsel, bruges den til at filtrere søgningens omfang til kun de dokumenter, der matcher forespørgslen. En forespørgsel er et dokument, der indeholder forespørgselsoperatorer. Som vi så i det foregående eksempel, returnerer et tomt dokument alle dokumenter.

Lad os indsnævre resultaterne til en undergruppe af dokumenter i samlingen.

db.pets.findOne({"type":"Cat"}) 

Resultat:

{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }

Dette indsnævrede søgningen til kun de dokumenter, der har en type felt med værdien Cat , derefter findOne() returnerede det første dokument fra det resultat.

I dette tilfælde har vi blot sendt et dokument som filtreringskriterier.

Du kan også bruge forespørgselsoperatorer. Disse giver dig mulighed for at anvende mere specifikke kriterier på din forespørgsel.

Eksempel:

db.pets.findOne({"weight": { $lt: 10 }}) 

Resultat:

{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }

Indlejrede dokumenter

Hvis du har dokumenter, der indeholder indlejrede dokumenter, kan du bruge følgende metoder til at forespørge data i de indlejrede dokumenter.

  • Priknotation (f.eks. field.nestedfield: <value> )
  • Indlejret form (f.eks. { field: { nestedfield: <value> } } ). Bemærk, at denne mulighed kun er tilgængelig fra MongoDB 4.4.

Antag, at vi indsætter følgende dokument.

db.pets.insertOne({ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, " color" :"brun" }})

Vi kan bruge punktnotation til at forespørge i det indlejrede dokument.

db.pets.findOne({ "specs.height": 400 }) 

Resultat:

{ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" }}

Følgende forespørgsel returnerer det samme dokument, bortset fra at denne gang henviser vi til det indlejrede dokument ved hjælp af indlejret form.

db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Resultat:

{ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" }}

Når du bruger den indlejrede formular, skal forespørgslen matche hele det indlejrede dokument nøjagtigt. For eksempel stemmer følgende forespørgsel ikke:

db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Resultat:

null

Arrays

Du kan referere til data i arrays ved at referere til array-elementet efter dets indeks eller efter dets værdi.

Antag, at vi indsætter følgende dokument:

db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Tophund", "Bedste hund", "Største hund" " ]})

Hvis vi ønskede at finde alle hunde med Top Dog-prisen, kunne vi skrive følgende forespørgsel (som vil returnere ovenstående hund).

db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Resultat:

{ "_id" :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Tophund", "Bedste hund", "Største hund" ]}

Du kan også angive elementindekset på denne måde:

db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

At gøre det kræver, at den angivne værdi er ved det angivne indeks. Derfor returnerer følgende forespørgsel ikke den samme hund.

db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Bemærk, at arrays er nul-baserede, så et indeks på 0 angiver det første element, 1 angiver det andet element, og så videre.

Projektioner

Som standard returneres alle dokumentfelter, når du bruger findOne() . Men du kan bruge fremskrivninger til at reducere antallet af returnerede felter, hvis det er nødvendigt.

Du husker måske, at syntaksen for findOne() går sådan her:

db.collection.findOne(query, projection) 

Hvor query giver filtreringskriterierne (som vi har gjort i ovenstående eksempler) og projection er en valgfri projektion, der specificerer, hvilke felter der skal returneres fra matchende dokumenter. Derfor, hvis vi ønsker at bruge en projektion, sætter vi den blot efter forespørgslen.

Når du bruger en projektion, kan du angive de felter, der skal inkluderes , felterne til ekskludering , eller begge. For at gøre dette skal du angive navnet på feltet og enten en 1 (for at inkludere det) eller 0 (for at udelukke det).

Her er et eksempel på brug af en projektion til at angive de felter, der skal inkluderes:

db.pets.findOne({}, { name: 1, type: 1 }) 

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund" }

Bemærk, at _id felt returneres, selvom vi ikke inkluderede det i vores fremskrivning. Dette felt er en undtagelse og er inkluderet som standard.

Hvis du ikke vil have _id felt, der skal returneres, skal du eksplicit ekskludere det.

db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Resultat:

{ "name" :"Wag", "type" :"Hund" }

Her er endnu et eksempel, denne gang angiver vi kun, hvilke felter der skal ekskluderes.

db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Resultat:

{ "name" :"Wag", "type" :"Hund" }

Flere projektioner

Der er forskellige andre ting, du kan gøre med projektioner. Fra MongDB 4.4 kan du f.eks. bruge aggregerede udtryk til at angive værdien af ​​et projekteret felt.

Eksempel:

db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Resultat:

{ "n" :"Wag", "t" :"Hund", "w" :20 }

Her omdøbte vi feltnavnene. Vi gjorde dette ved at angive et nyt navn for hvert felt som en streng-literal, ved at bruge $fieldName syntaks for at udlæse felternes værdi. Resultatet er lidt som at bruge aliaser i SQL.

Flere oplysninger

Se MongoDB-dokumentationen for mere information.


  1. Hvad er et godt valg af database til en lille .NET-applikation?

  2. mongodb-godkendelse med forbindelsesstreng

  3. Hvordan ser jeg en mongo-database ved hjælp af docker-compose?

  4. Hvordan forbinder du til et replikasæt fra en MongoDB-skal?