MongoDB-metoden findOne er ypperlig for å søke i en samling. Den returnerer imidlertid bare ett enkelt resultat, noe som gjør den uegnet for mange typer søk.

Hva er MongoDB findOne?

MongoDB er et databasestyringssystem som enkelt kan lagre og administrere store datamengder takket være NoSQL-tilnærmingen og den bemerkelsesverdige skalerbarheten. Selv om disse aspektene gir brukerne betydelige fordeler, betyr det også at systemet trenger robuste metoder for å sikre at brukerne kan navigere effektivt i databasen.

Systemet lagrer alle typer data i form av et BSON-dokument (binær JSON) og samler disse dokumentene i samlinger. Hvis du vil søke etter og skrive ut et av disse dokumentene, har du flere alternativer til rådighet. I tillegg til den mer generelle søkemetoden MongoDB find, er MongoDB findOne en svært effektiv metode for å filtrere gjennom store databaser med presisjon.

MongoDB findOne søker i alle dokumenter og samlinger etter bestemte kriterier angitt av brukeren. Det spesielle med denne metoden er at den alltid returnerer nøyaktig ett dokument. Hvis det bare er ett dokument i søket, vil dette dokumentet bli returnert. Hvis flere dokumenter samsvarer med parametrene som er definert av brukeren, vil MongoDB findOne returnere det dokumentet som vises først i den naturlige rekkefølgen i databasen. Hvis det ikke finnes noen dokumenter i søket, blir resultatet «null».

Hva er syntaksen for MongoDB findOne?

Den grunnleggende syntaksen til MongoDB findOne er enkel. Metoden brukes slik:

db.collection.findOne ( <query>, <projection>, <options> )
shell

Under <query> kan du spesifisere hvordan metoden skal filtrere dokumentene.

Under <projection> kan du angi hvilke felt som skal vises for dokumentet som returneres. Bruk de boolske verdiene 1 (sant/inkluder) og 0 (usant/ekskluder) for å angi om et felt skal inkluderes. Hvis denne parameteren forblir tom, vil alle feltene vises.

Den tredje søkeparameteren <options> lar deg endre søket ytterligere og også endre visningen. Alle tre søkeparametrene er valgfrie.

Hvordan opprette en samling for testformål

Hvis du har installert MongoDB på Linux, Windows eller Mac og ønsker å bruke MongoDB findOne, er det lurt å sette opp et testmiljø for å eksperimentere med metoden.

Hvis du ikke har opprettet en database ennå, kan du lese vår omfattende MongoDB-veiledning for å lære hvordan du oppretter en. I eksemplet nedenfor skal vi bruke en ansattdatabase med fem oppføringer. Hver oppføring inneholder informasjon om navn, kjønn og alder på ansatte, samt hvor lenge personen har vært i selskapet. Samlingen ser slik ut:

# Create Collection
db.employee.insertMany ( [
    {
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
    },
    {
    name : "Jones",
    gender : "Female",
    age : 40,
    year : 2017,
    },
    {
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
    },
    {
    name : "Michaels",
    gender : "Female",
    age : 44,
    year : 2015
    },
    name : "Cartwright",
    gender : "Male",
    age : 22,
    year : 2022
    }
]
)
shell

Hva er forskjellige måter å søke med Mongo DB findOne på?

Det finnes flere måter å søke etter informasjon på ved hjelp av MongoDB findOne. Du kan søke uten parametere, med en ID, med ett felt eller med flere felt.

Søk uten parametere

Hvis du bruker MongoDB findOne-metoden uten parametere, vil systemet søke i databasen din og ta alle oppføringer i betraktning. I vårt eksempel betyr dette at metoden vil identifisere fem oppføringer. Siden ingen av dokumentene er ekskludert og metoden bare returnerer ett resultat, vil MongoDB findOne velge den første personen som ble lagt inn i databasen.

db.employee.findOne ( )
shell

Resultatet er:

db.employee.findOne ( )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Søk etter ID

Normalt vil du angi noen kriterier for søket ditt, slik at du ender opp med det dokumentet du faktisk trenger. En måte du kan søke etter dokumenter med MongoDB findOne på, er ved å søke etter en ID.

Feltet _id er unikt i hvert dokument. I vårt eksempel representerer hver ID nøyaktig én ansatt. Hvis du kjører MongoDB findOne ved hjelp av objekt-ID-en, får du nøyaktig det resultatet du leter etter.

db.employee.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
shell

Resultatet ser slik ut:

db.employee.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
{
    _id : ObjectID ( "582pfh773813tw982qj411l0"
    name : "Cartwright",
    gender : "Male",
    age : 22,
    year : 2022
}
shell

Søk ved hjelp av bestemte felt

Hvis du ikke kjenner ID-en eller ønsker å søke i samlingen din etter andre parametere, kan du også bruke MongoDB findOne til å søke etter bestemte felt. Hvis det bare er ett dokument som samsvarer med parameteren, er det dette dokumentet som vises. Hvis flere dokumenter samsvarer med søkekriteriene dine, viser systemet imidlertid bare den første oppføringen.

I eksemplet nedenfor skal vi søke etter alle oppføringer med «Mann» som kjønn. Her er kommandoen:

db.employee.findOne ( { gender : "Male" } )
shell

Det er to oppføringer som oppfyller dette kriteriet, men bare én vil vises. Utdataene viser den ansatte Mr. Brown:

db.employee.findOne ( { gender : "Male" } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

Søk ved hjelp av flere felt

Du har også muligheten til å begrense søket ytterligere for å unngå overlappinger. Dette er kanskje ikke nødvendig for vår lille samling av eksempler, men hvis du arbeider med flere hundre eller til og med tusenvis av oppføringer, kan denne muligheten være nyttig. MongoDB findOne lar deg bruke flere felt for søket. Hvis du vil identifisere en ansatt etter kjønn (mann) og alder, kan du skrive følgende:

db.employee.findOne ( { gender : "Male", age: 40 } )
shell

Resultatet viser igjen Mr. Brown, som er den eneste personen i samlingen som er mann og 40 år gammel. Ms. Jones er på samme alder, men hennes kjønn samsvarer ikke med kriteriene, så resultatet ser slik ut:

db.employee.findOne ( { gender : "Male", age: 40 } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

Hvordan angi betingelser for et felt ved hjelp av MongoDB findOne

Det er også mulig å definere betingelser for et bestemt felt og bruke disse som søkekriterier. I følgende eksempel søker vi bare etter ansatte som er over 30 år.

Denne oppføringen ser slik ut:

db.employee.findOne ( { age : { $gt : 30 } } )
shell

Dette utelukker Mr. Cartwright. Siden Ms. Smith er over 30 år og er den første personen på listen, vises hun som resultatet:

db.employee.findOne ( { age : { $gt : 30 } } )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Hvordan ekskludere felt med MongoDB findOne

Hvis du har omfattende samlinger som inneholder mye informasjon, kan utdataene inneholde for mye informasjon. Heldigvis tilbyr MongoDB findOne også muligheten til å ekskludere felt fra utdataene. I det følgende eksemplet ønsker vi ikke å vise ID, kjønn og alder i utdataene.

db.employee.findOne ( { name : "Smith" }, { _id : 0, gender : 0, age : 0 } )
shell

Du vil få følgende utdata:

db.employee.findOne ( { name : "Smith" }, { _id : 0, gender : 0, age : 0 } )
{
    name : "Smith",
    year : 2002
}
shell

Hva skjer hvis MongoDB findOne ikke finner noen resultater for søket mitt?

Hvis det ikke finnes noen resultater for søket ditt med MongoDB findOne, vil det likevel vises en utdata. For å illustrere hva som skjer, søker vi etter Ms. Larkham, som ikke finnes i samlingen.

db.employee.findOne ( { name : "Larkham" }  )
shell

Resultatet for dette er:

db.employee.findOne ( { name : "Larkham" }  )
null
shell
Tip

Det gratis GUI-programmet MongoDB Compass gjør det enklere å administrere databasen din. Les mer om det grafiske brukergrensesnittet i en annen artikkel i vår digitale guide.

c601ef95ac62761b8e3583955193ed29

5eba7ed8d4bd7730050a34ca3b643068

cade61e32364b18cfedf411338034385

c66347cd1c5b1dc66d9dfb6f8fc74ca3

Go to Main Menu