MongoDB-metoden findOne er fan­ta­stisk til at søge i en samling. Den re­tur­ne­rer dog kun et enkelt resultat, hvilket gør den uegnet til mange typer søgninger.

Hvad er MongoDB findOne?

MongoDB er et da­ta­ba­sesty­rings­sy­stem, der nemt kan gemme og ad­mi­ni­stre­re store mængder data takket være sin NoSQL-tilgang og be­mær­kel­ses­vær­di­ge ska­ler­bar­hed. Selvom disse aspekter giver brugerne be­ty­de­li­ge fordele, betyder det også, at systemet har brug for stærke metoder for at sikre, at brugerne effektivt kan navigere i databasen.

Systemet gemmer alle typer data i form af et BSON-dokument (binært JSON) og samler disse do­ku­men­ter i samlinger. Hvis du vil søge efter og udskrive et af disse do­ku­men­ter, har du flere mu­lig­he­der. Ud over den mere generelle sø­ge­me­to­de MongoDB find er MongoDB findOne en meget effektiv metode til at filtrere store databaser med stor præcision.

MongoDB findOne søger i alle do­ku­men­ter og samlinger efter bestemte kriterier, der er angivet af brugeren. Det særlige ved denne metode er, at den altid re­tur­ne­rer nøjagtigt ét dokument. Hvis der kun er ét dokument i sø­ge­fo­re­spørgs­len, re­tur­ne­res dette dokument. Hvis flere do­ku­men­ter matcher de parametre, der er defineret af brugeren, re­tur­ne­rer MongoDB findOne det dokument, der vises først i den naturlige ræk­ke­føl­ge i databasen. Hvis der ikke kan findes nogen do­ku­men­ter i søgningen, er outputtet ‘null’.

Hvad er syntaksen for MongoDB findOne?

Den grund­læg­gen­de syntaks for MongoDB findOne er ligetil. Metoden bruges på følgende måde:

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

Under <query> kan du angive, hvordan metoden skal filtrere do­ku­men­ter­ne.

Under <projection> kan du angive, hvilke felter der skal vises for det dokument, der re­tur­ne­res. Brug de boolske værdier 1 (sand/inkluder) og 0 (falsk/ekskluder) til at angive, om et felt skal in­klu­de­res. Hvis denne parameter forbliver tom, vises alle felter.

Den tredje sø­ge­pa­ra­me­ter <options> giver dig mulighed for at ændre søgningen yder­li­ge­re og også ændre visningen. Alle tre sø­ge­pa­ra­me­tre er valgfri.

Sådan oprettes en samling til test­for­mål

Hvis du har in­stal­le­ret MongoDB på Linux, Windows eller Mac og ønsker at bruge MongoDB findOne, er det en god idé at oprette et testmiljø, hvor du kan afprøve metoden.

Hvis du endnu ikke har oprettet en database, kan du læse vores om­fat­ten­de MongoDB-vej­led­ning for at lære, hvordan du opretter en. I vores eksempel nedenfor bruger vi en me­d­ar­bej­der­da­ta­ba­se med fem poster. Hver post in­de­hol­der op­lys­nin­ger om me­d­ar­bej­der­nes navn, køn og alder samt hvor længe personen har været ansat i virk­som­he­den. Samlingen ser således ud:

# 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

Hvilke for­skel­li­ge måder er der at søge med Mongo DB findOne?

Der er mere end én måde at søge efter op­lys­nin­ger ved hjælp af MongoDB findOne. Du kan søge uden parametre, med et ID, med et felt eller med flere felter.

Søgning uden parametre

Hvis du bruger MongoDB findOne-metoden uden parametre, vil systemet søge i din database og tage alle poster i be­tragt­ning. I vores eksempel betyder det, at metoden vil iden­ti­fi­ce­re fem poster. Da ingen af do­ku­men­ter­ne er eks­klu­de­ret, og metoden kun re­tur­ne­rer ét resultat, vil MongoDB findOne vælge den første person, der blev indtastet i databasen.

db.employee.findOne ( )
shell

Outputtet er:

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

Søgning efter ID

Normalt vil du angive nogle kriterier for din søgning, så du ender med det dokument, du faktisk har brug for. En måde, du kan søge efter do­ku­men­ter med MongoDB findOne, er ved at søge efter et ID.

Feltet _id er unikt i hvert dokument. I vores eksempel re­præ­sen­te­rer hvert ID nøjagtigt én me­d­ar­bej­der. Hvis du kører MongoDB findOne ved hjælp af objekt-ID’et, får du det nøjagtige resultat, du leder efter.

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

Re­sul­ta­tet ser således ud:

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

Søgning ved hjælp af spe­ci­fik­ke felter

Hvis du ikke kender ID’et eller ønsker at søge i din samling efter andre parametre, kan du også bruge MongoDB findOne til at søge efter bestemte felter. Hvis der kun er ét dokument, der matcher pa­ra­me­te­ren, er det det dokument, der vises. Hvis flere do­ku­men­ter matcher dine sø­ge­kri­te­ri­er, viser systemet dog kun den første post.

I eksemplet nedenfor søger vi efter alle poster, hvor kønnet er angivet som ‘Mand’. Her er kom­man­do­en:

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

Der er to poster, der matcher disse kriterier, men kun én vises. Outputtet viser me­d­ar­bej­de­ren Mr. Brown:

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

Søgning ved hjælp af flere felter

Du har også mulighed for at indsnævre din søgning yder­li­ge­re for at undgå over­lap­nin­ger. Dette er måske ikke nød­ven­digt for vores lille prø­ve­sam­ling, men hvis du arbejder med flere hundrede eller endda tusinder af poster, er denne mulighed meget praktisk. MongoDB findOne giver dig mulighed for at bruge flere felter til søgningen. Hvis du vil iden­ti­fi­ce­re en me­d­ar­bej­der efter køn (mand) og alder, kan du skrive følgende:

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

Re­sul­ta­tet viser igen hr. Brown, som er den eneste person i samlingen, der er mand og 40 år gammel. Fru Jones er samme alder, men hendes køn matcher ikke kri­te­ri­er­ne, så re­sul­ta­tet ser således ud:

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

Sådan indstil­les be­tin­gel­ser for et felt ved hjælp af MongoDB findOne

Det er også muligt at definere be­tin­gel­ser for et bestemt felt og bruge disse som sø­ge­kri­te­ri­er. I det følgende eksempel søger vi kun efter me­d­ar­bej­de­re, der er over 30 år.

Denne post ser således ud:

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

Dette udelukker hr. Cartwright. Da fru Smith er over 30 år og er den første person på listen, vises hun som re­sul­ta­tet:

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

Sådan udelukkes felter med MongoDB findOne

Hvis du har om­fat­ten­de samlinger, der in­de­hol­der mange op­lys­nin­ger, kan outputtet indeholde for mange op­lys­nin­ger. Heldigvis tilbyder MongoDB findOne også mu­lig­he­den for at udelade felter fra outputtet. I det følgende eksempel ønsker vi ikke at vise ID, køn og alder i outputtet.

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

Du får følgende output:

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

Hvad sker der, hvis MongoDB findOne ikke kan finde nogen re­sul­ta­ter for min søgning?

Hvis der ikke er nogen re­sul­ta­ter for din søgning med MongoDB findOne, vises der stadig et output. For at il­lu­stre­re, hvad der sker, søger vi efter Ms. Larkham, som ikke er i samlingen.

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

Re­sul­ta­tet for dette er:

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

Den gratis GUI MongoDB Compass gør det nemmere at ad­mi­ni­stre­re din database. Læs mere om den grafiske bru­ger­græn­se­fla­de i en anden artikel i vores digitale guide.

Gå til ho­ved­me­nu­en