I MongoDB er db.collection.find()
metode vælger dokumenter i en samling eller visning og returnerer en markør til de valgte dokumenter.
collection
del er navnet på samlingen eller visningen, der skal søges i.
Du kan bruge det til at returnere alle dokumenter, kun nogle eller kun ét dokument. Du kan også angive, hvilke felter der skal returneres.
Det er vigtigt at bemærke, at det faktisk ikke returnerer dokumenterne. Det returnerer blot en markør til dokumenterne. Når det er sagt, er det nemmere at sige, at det "returnerer dokumenter", og det omtales typisk på den måde - også i denne artikel 🙂
Returner alle dokumenter
Her er et eksempel til at demonstrere.
db.pets.find()
Resultat:
{ "_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 }Her bruger vi
find()
metode til at returnere alle dokumenter frapets
kollektion. Vi ved, at dette returnerer alle dokumenter, fordi vi ikke har angivet nogen filtreringskriterier. Faktisk har vi ikke givet nogen argumenter.Når kaldet uden argumenter,
find()
returnerer alle dokumenter fra en samling og returnerer alle felter for dokumenterne.En anden måde at gøre ovenstående på er sådan her:
db.pets.find({})
I dette tilfælde sender vi et tomt dokument.
Ved at tilføje til dette tomme dokument, kan vi begynde at filtrere resultaterne.
Filtrer resultaterne
Den faktiske syntaks for
find()
går sådan her:db.collection.find(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 resultaterne. 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.find({"type":"Dog"})
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Hund", "vægt" :10 }Dette indsnævrede resultaterne til kun de dokumenter, der har en
type
felt med værdienDog
.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.find({"weight": { $lt: 10 }})
Resultat:
{ "_id" :3, "name" :"Mjav", "type" :"Kat", "vægt" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kat", "vægt" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus", "vægt" :3 }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.find({ "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.find({
"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.find({
"specs" : {
"height" : 400
}
})
Formatér resultaterne
Det forrige eksempels resultat blev returneret på én linje. Du kan bruge cursor.pretty()
metode til at konfigurere markøren til at vise resultaterne i et mere læsbart format.
For at bruge pretty()
metode, skal du tilføje den til find()
metode.
Eksempel:
db.pets.find({ "_id": 6 }).pretty()
Resultat:
{ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" }}
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.find({
"awards": "Top Dog"
}).pretty()
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.find({
"awards.0": "Top Dog"
}).pretty()
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.find({
"awards.1": "Top Dog"
}).pretty()
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 find()
. Men du kan bruge fremskrivninger til at reducere antallet af returnerede felter, hvis det er nødvendigt.
Du husker måske, at syntaksen for find()
går sådan her:
db.collection.find(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).
På nuværende tidspunkt indeholder vores samling 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 }{ " _id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" } }{ "_id" " :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Tophund", "Bedste hund", "Største hund" ] }
Her er et eksempel på brug af en projektion til at angive de felter, der skal inkluderes:
db.pets.find({}, { name: 1, type: 1 })
Resultat:
{ "_id" :1, "name" :"Wag", "type" :"Hund" }{ "_id" :2, "name" :"Bark", "type" :"Hund" }{ "_id" :3, "name" :"Mjav", "type" :"Kat" }{ "_id" :4, "name" :"Scratch", "type" :"Kat" }{ "_id" :5, "name" :"Bruce", "type" :"Flagermus" }{ "_id" :6, "name" :"Fetch", "type" :"Hund" }{ "_id" :7, "name " :"Jake", "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.find({}, { _id: 0, name: 1, type: 1 })
Resultat:
{ "name" :"Wag", "type" :"Hund" }{ "name" :"Bark", "type" :"Hund" }{ "name" :"Mjav", "type" :"Kat" }{ "name" :"Scratch", "type" :"Kat" }{ "name" :"Bruce", "type" :"Flagermus" }{ "name" :"Hent", "skriv" :"Hund" }{ "name" :"Jake", "type" :"Hund" }
Her er endnu et eksempel, denne gang angiver vi kun, hvilke felter der skal ekskluderes.
db.pets.find({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
Resultat:
{ "name" :"Wag", "type" :"Hund" }{ "name" :"Bark", "type" :"Hund" }{ "name" :"Mjav", "type" :"Kat" }{ "name" :"Scratch", "type" :"Kat" }{ "name" :"Bruce", "type" :"Flagermus" }{ "name" :"Hent", "skriv" :"Hund" }{ "name" :"Jake", "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.find({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
Resultat:
{ "n" :"Wag", "t" :"Hund", "w" :20 }{ "n" :"Bark", "t" :"Hund", "w" :10 }{ "n" :"Mjav", "t" :"Kat", "w" :7 }{ "n" :"Krat", "t" :"Kat", "w" :8 }{ "n" :"Bruce", "t" :"Flagermus", "w" :3 }{ "n" :"Hent", "t" :"Hund" }{ "n" :"Jake", "t" :"Hund " }
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.