Sådan bruges MongoDB-forespørgsler
MongoDB-forespørgsler giver dig mulighed for at søge og analysere din database hurtigt og effektivt. Metodens struktur er logisk, og du kan bruge adskillige parametre sammen med den.
Sådan søger du effektivt i samlinger
Som en dokumentbaseret NoSQL-løsning giver MongoDB brugerne mulighed for nemt at gemme og administrere store og forskelligartede datamængder. Databasestyringssystemet er meget fleksibelt og kan nemt skaleres horisontalt.
I modsætning til relationelle databaser gemmes data i Mongo DB i BSON-dokumenter (binær JSON) og samles i samlinger. For at denne tilgang virkelig kan fungere, er det vigtigt athave stærke søgemekanismer, der kan gennemgå databasen og præsentere de oplysninger, som brugerne har brug for. Med MongoDB-søgninger kan databasen endda søge i komplekst strukturerede samlinger for at levere de oplysninger, du leder efter.
Er det for forvirrende at bruge shell til MongoDB? MongoDB Compass er en gratis grafisk brugergrænseflade, der gør det nemt at navigere i MongoDB.
Hvad er MongoDB-forespørgsler?
MongoDB-forespørgsler er et brugervenligt værktøj, der bruges til at søge i komplekse datastrukturer. De følger logiske regler og fungerer som de filterindstillinger, du finder på de fleste websteder. Dette giver dig mulighed for at formulere din søgning så præcist som muligt, så du kan opnå de bedst mulige resultater. Dette er især vigtigt, da MongoDB kan gemme mange forskellige typer data. Uden de nødvendige filterindstillinger ville det være vanskeligt at administrere databasen. I de følgende afsnit forklarer vi, hvad du har brug for for at oprette MongoDB-forespørgsler, og hvordan du bruger dem.
Hvad er kravene til MongoDB-forespørgsler?
Der er kun få krav til brug af MongoDB-forespørgsler.
- Du skal have MongoDB installeret på din computer. Databasen fungerer på mange operativsystemer, så nedenstående instruktioner virker, uanset om du bruger Linux, OS X eller Windows. Trinene efter installationen er de samme på alle systemer og påvirker kun selve databasen. Du kan finde ud af, hvordan installationen fungerer, i vores MongoDB-vejledning.
- Du skal have administratorrettigheder for at kunne bruge søgefunktionen.
- Det er bedst at oprette et testmiljø, så du kan afprøve Mongo DB-forespørgsler uden risiko.
Hvordan man strukturerer en testsamling
Åbn først shellen og log ind som administrator. Opret derefter en ny samling, der skal fungere som testmiljø for dine første MongoDB-forespørgsler. Ud over at søge i enkle dokumenter kan metoden også søge i arrays, forskellige felter og indlejrede dokumenter, og derfor har vi besluttet at oprette en lidt mere kompleks samling. På den måde får du et bedre indtryk af omfanget af MongoDB-forespørgsler.
Vores eksempel består af en liste over kunder. Formatet for denne liste er som følger:
{
"name" : "Schulz",
"units" : 642,
"location" : [ "Germany", "Austria" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2023,
},
"total" : 14
}
}shellDette dokument indeholder følgende oplysninger:
- navn: Navnet på det firma, der har købt varerne.
- enheder: Det samlede antal produkter, som virksomheden har bestilt.
- placering: Virksomhedens placering. Hvis der er flere filialer, kan disse gemmes i form af en matrix.
- transaktioner: Dette felt indeholder et yderligere dokument. Dokumenter som dette kaldes ‘indlejrede dokumenter’ eller ‘indlejrede dokumenter’. Hvert af transaktionsdokumenterne indeholder oplysninger om, hvor længe virksomheden har været kunde (under ‘første’ punkt), hvornår den sidste ordre blev afgivet (under ‘sidste’ punkt) og det samlede antal gange, virksomheden har bestilt produkter (under ‘samlet’ punkt).
I dette eksempel har vi tilføjet yderligere dokumenter for at gøre det lettere at inkludere oplysninger på et senere tidspunkt. Dette bidrager til at sikre et godt overblik over oplysningerne i databasen.
Oprettelse af en testsamling til MongoDB-forespørgsler
Nu skal vi oprette en samling kaldet ‘Kunder’. For at det er nemt at bevare overblikket over samlingen, vil vi kun inkludere fem poster. Hvis du bruger MongoDB-forespørgsler i dit arbejde, kan du oprette mere omfattende samlinger ved hjælp af metoden insertMany.
Sådan ser vores testsamling ud:
db.customers.insertMany ( [
{
"name" : "Schulz",
"location" : [ "Germany", "Austria" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2023,
},
"total" : 14
}
},
{
"name" : "ATS",
"units" : 17,
"location" : "France",
"transactions" : {
"first" : {
"year" : 2021,
},
"last" : {
"year" : 2022,
},
"total" : 2,
}
},
{
"name" : "Meyer",
"units" : 814,
"location" : [ "Austria", "Germany" ],
"transactions" : {
"first" : {
"year" : 2016,
},
"last" : {
"year" : 2023,
},
"total" : 22,
}
},
{
"name" : "Pawolski",
"units" : 313,
"location" : [ "Germany", "Poland" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2020,
},
"total" : 9,
}
},
{
"name" : "Jorgensen",
"units" : 7,
"location" : "Denmark",
"transactions" : {
"first" : {
"year" : 2022,
},
"last" : {
"year" : 2023,
},
"total" : 2,
}
}
] )shellNår du kører denne post med de data, vi har brugt (eller med dine egne data), får du en liste over objekt-id’er tilbage. Disse er unikke og sikrer, at hvert dokument også kan findes via et tilsvarende id. Hvis du vil sikre dig, at alle dokumenter er medtaget i samlingen, kan du bruge MongoDB find uden parametre:
db.customers.find ( )shellResultatet er en liste over alle objekt-ID’er med de komplette dokumenter. Du kan nu søge i dem ved hjælp af MongoDB-forespørgsler.
Sådan bruges MongoDB-forespørgsler med felter og arrays
Du kan bruge MongoDB-forespørgsler til at søge i enkelte felter, flere felter, arrays og indlejrede dokumenter. Vi vil se nærmere på hver af disse i afsnittene nedenfor.
Forespørgsel på individuelle felter med MongoDB-forespørgsler
Output fra MongoDB find viser, hvor nyttige MongoDB-forespørgsler kan være. Vores lille eksempel giver et output med lange tegnstrenger, så du kan forestille dig, hvordan det er, hvis du arbejder med et større eksempel.
I det følgende eksempel bruger vi også find, men denne gang opstiller vi et særligt krav, som et dokument skal opfylde for at blive udskrevet. Konkret vil vi søge efter alle dokumenter, der har navnet ‘ATS’.
db.customers.find (
{ "name" : "ATS" }
)shellEnkle MongoDB-forespørgsler som denne vil nu søge i alle dokumenterne i samlingen og matche dem, der har navneværdien ‘ATS’. Dette gælder kun for én post i vores samling, så resultatet ser således ud:
db.customers.find ( { "name" : "ATS" } )
{
"_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
"name" : "ATS",
"units" : 17,
"location" : "France",
"transactions" : {
"first" : {
"year" : 2021,
},
"last" : {
"year" : 2022,
},
"total" : 2
}shellDet fungerer også omvendt. Hvis du vil vise alle resultater undtagen posten for ‘ATS’, skal du indtaste følgende:
db.customers.find (
{ "name" : { $ne : "ATS" } }
)shellHvis du vil udskrive MongoDB-forespørgsler med forskellige værdier, kan du gøre det med en matrix. Vi gør dette ved hjælp af kunderne ATS og Jorgensen.
db.customers.find (
{ "name" : [ $in : [ "ATS", "Jorgensen" ] } }
)shellForespørgsel på flere felter med MongoDB-forespørgsler
Hvis du har brug for præcise resultater, er det vigtigt at gøre din forespørgsel mere specifik. Du kan gøre dine MongoDB-forespørgsler mere præcise ved at bruge yderligere parametre. Nedenfor angiver vi en værdi fra segmentet ‘units’ ud over firmanavnet ‘ATS’. På denne måde søger vores forespørgsel efter et dokument, der indeholder begge værdier:
db.customers.find (
{ "name" : "ATS", "units" : 17 }
)shellVi har et nøjagtigt match. Hvis kun én af de to værdier matcher, vises der ingen resultater. Her er et eksempel på en forespørgsel uden resultater:
db.customers.find (
{ "name" : "ATS", "units" : 25 }
)shellHvis du vil tage forskellige værdier i betragtning, når du bruger MongoDB-forespørgsler, men ønsker, at forespørgslen skal give et resultat, selvom kun et af kravene er opfyldt, skal du indtaste følgende:
db.customers.find (
{ $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)shellForespørgsel på værdier i arrays
Du kan også tage værdier i arrays i betragtning med MongoDB-forespørgsler. I vores samling er der virksomheder, der har filialer i flere lande. Hvis du vil vise alle virksomheder, der har mindst én filial i Tyskland, kan du indtaste følgende:
db.customers.find (
{ "location" : "Germany" }
)shellResultatet indeholder nu alle tre kunder, der har mindst én filial i Tyskland. Hvis du vil udvide din indtastning og finde virksomheder, der har filialer i Tyskland og Østrig ved hjælp af den samme forespørgsel, kan du bruge en matrix:
db.customers.find (
{ "location" : [ "Germany", "Austria" ] }
)shellDu vil bemærke, at indtastningen kun viser ét resultat, selvom to virksomheder teoretisk set matcher søgekriterierne. Årsagen til dette er, at MongoDB-forespørgsler holder sig nøjagtigt til den indtastning, de får, hvilket inkluderer rækkefølgen af elementerne. Hvis du ønsker, at metoden skal tage højde for værdier uanset den rækkefølge, de vises i, skal du skrive forespørgslen som følger:
db.customers.find (
{ "location" : { $all : [ "Germany", "Austria" ] } }
)shellForespørgsel på værdier i indlejrede dokumenter
I vores samling har vi også indlejrede dokumenter, som også kan udskrives ved hjælp af MongoDB-forespørgsler. For at gøre dette skal du tilføje et punktum for at signalere til MongoDB, at et felt i et indlejret dokument skal analyseres. Hvis du f.eks. ønsker en liste over alle kunder, der har mere end ti transaktioner, skal du indtaste følgende:
db.customers.find (
{ "transactions.total" : { $gt : 10 } }
)shellMongoDB åbner dokumentet “transactions” og søger derefter efter det samlede antal transaktioner under “total”.
Sådan begrænses outputtet fra MongoDB-forespørgsler
Outputtet fra MongoDB-forespørgsler kan være ret omfattende, hvorfor det kan være en god idé at begrænse outputtet til blot et par felter. Du kan bruge projektioner til at begrænse antallet af felter, der vises i outputtet. Disse indeholder værdien 1 (felter, der skal medtages i outputtet) og 0 (felter, der ikke skal medtages i outputtet).
I det følgende eksempel vil vi udføre en todelt forespørgsel. Først vil vi starte en søgning uden parametre ved hjælp af metoden find. I sig selv vil den udskrive alle dataene i samlingen. Men vi vil straks efterfølgende lave en projektion, der kun tager højde for navnefeltet.
db.customers.find (
{ }
{ "name" : 1 }
)shellAlle kunder vises, men udskriften er begrænset til virksomhedsnavne.
Hvad er cursors, og hvordan kan jeg bruge dem i MongoDB-forespørgsler?
Cursorer giver mulighed for at tilpasse visningen af Mongo DB-forespørgselsresultater uden at ændre de faktiske resultater af forespørgslen. Du kan f.eks. begrænse antallet af resultater, der vises, eller ændre deres rækkefølge. Hvis du kun vil vise to af resultaterne, kan du bruge limit-metoden. Sådan gør du:
db.customers.find (
{ }
{ "name" : 1 }
).limit ( 2 )shellFor at sortere outputtet kan du bruge følgende indtastning. Dette vil vise de tre kunder, der har bestilt færrest produkter:
db.customers.find (
{ }
{ "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )shellFor at finde et bestemt dokument i din database kan du bruge MongoDB findONE -metoden. Vi forklarer denne metode mere detaljeret i en anden artikel i vores digitale guide.