In MongoDB de db.collection.findOne()
methode retourneert één document dat voldoet aan de opgegeven zoekcriteria voor de verzameling of weergave.
De collection
deel is de naam van de collectie of weergave die moet worden doorzocht.
findOne()
lijkt op find()
, behalve dat findOne()
retourneert alleen het eerste document dat overeenkomt met de filtercriteria, volgens de natuurlijke volgorde die de volgorde van documenten op de schijf weerspiegelt.
De find()
methode aan de andere kant, retourneert alle overeenkomende documenten.
Ook findOne()
geeft het eigenlijke document terug, terwijl find()
geeft alleen een cursor terug naar elk document. Daarom kunt u geen cursormethoden toepassen op findOne()
zoals je kunt met find()
.
Voorbeeld
Stel dat we een verzameling hebben met de naam pets
met de volgende documenten:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 } { "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 } { "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 } { "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 } { "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
We kunnen findOne()
. gebruiken om één document terug te sturen.
db.pets.findOne()
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
Hier hebben we alle documenten in de pets
. doorzocht verzameling. We weten dat hiermee alle documenten zijn doorzocht omdat we geen filtercriteria hebben opgegeven. We hebben zelfs geen argumenten gegeven.
Wanneer aangeroepen zonder argumenten, findOne()
doorzoekt alle documenten uit een verzameling en retourneert alle velden voor het overeenkomende document.
Een andere manier om het bovenstaande te doen is als volgt:
db.pets.findOne({})
In dit geval geven we een leeg document door.
Door aan dit lege document toe te voegen, kunnen we beginnen met het filteren van de resultaten.
Geef een zoekopdracht
De daadwerkelijke syntaxis van findOne()
gaat als volgt:
db.collection.findOne(query, projection)
Dit betekent dat u een query als het eerste argument kunt doorgeven en een projectie als het tweede.
Als u een zoekopdracht doorgeeft, wordt deze gebruikt om het bereik van de zoekopdracht te filteren op alleen die documenten die overeenkomen met de zoekopdracht. Een query is een document dat query-operators bevat. Zoals we in het vorige voorbeeld zagen, retourneert een leeg document alle documenten.
Laten we de resultaten beperken tot een subset van documenten in de collectie.
db.pets.findOne({"type":"Cat"})
Resultaat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Dit beperkte de zoekopdracht tot alleen die documenten met een type
veld met een waarde van Cat
, dan findOne()
het eerste document van dat resultaat geretourneerd.
In dit geval hebben we gewoon een document doorgegeven als filtercriterium.
U kunt ook query-operators gebruiken. Hiermee kunt u specifiekere criteria toepassen op uw vraag.
Voorbeeld:
db.pets.findOne({"weight": { $lt: 10 }})
Resultaat:
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
Ingesloten documenten
Als u documenten heeft die ingesloten documenten bevatten, kunt u de volgende methoden gebruiken om gegevens in de ingesloten documenten op te vragen.
- Puntnotatie (bijv.
field.nestedfield: <value>
) - Genest formulier (bijv. {
field: { nestedfield: <value> } }
). Merk op dat deze optie alleen beschikbaar is vanaf MongoDB 4.4.
Stel dat we het volgende document invoegen.
db.pets.insertOne({ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } })
We kunnen puntnotatie gebruiken om te zoeken in het ingesloten document.
db.pets.findOne({ "specs.height": 400 })
Resultaat:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
De volgende query retourneert hetzelfde document, behalve dat we deze keer verwijzen naar het ingesloten document met een geneste vorm.
db.pets.findOne({
"specs" : {
"height" : 400,
"weight" : 15,
"color" : "brown"
}
})
Resultaat:
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
Bij gebruik van het geneste formulier moet de query exact overeenkomen met het hele ingesloten document. De volgende zoekopdracht komt bijvoorbeeld niet overeen:
db.pets.findOne({
"specs" : {
"height" : 400
}
})
Resultaat:
null
Arrays
U kunt naar gegevens in arrays verwijzen door naar het array-element te verwijzen met zijn index of zijn waarde.
Stel dat we het volgende document invoegen:
db.pets.insertOne({ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] })
Als we alle honden met de Top Dog-award wilden vinden, zouden we de volgende vraag kunnen schrijven (die de bovenstaande hond zal opleveren).
db.pets.findOne({
"awards": "Top Dog"
})
Resultaat:
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
U kunt de elementindex ook als volgt specificeren:
db.pets.findOne({
"awards.0": "Top Dog"
})
Om dat te doen, moet de opgegeven waarde zich in de opgegeven index bevinden. Daarom retourneert de volgende zoekopdracht niet dezelfde hond.
db.pets.findOne({
"awards.1": "Top Dog"
})
Merk op dat arrays op nul zijn gebaseerd, dus een index van 0 specificeert het eerste element, 1 specificeert het tweede element, enzovoort.
Projecties
Standaard worden alle documentvelden geretourneerd wanneer u findOne()
. gebruikt . Maar u kunt indien nodig projecties gebruiken om het aantal geretourneerde velden te verminderen.
U herinnert zich misschien dat de syntaxis voor findOne()
gaat als volgt:
db.collection.findOne(query, projection)
Waar query
biedt de filtercriteria (die we in de bovenstaande voorbeelden hebben gedaan), en projection
is een optionele projectie die aangeeft welke velden moeten worden geretourneerd uit overeenkomende documenten. Daarom, als we een projectie willen gebruiken, plaatsen we deze gewoon na de vraag.
Wanneer u een projectie gebruikt, kunt u de velden specificeren om op te nemen , de velden om uit te sluiten , of allebei. Om dit te doen, vermeldt u de naam van het veld en een 1
(om het op te nemen) of 0
(om het uit te sluiten).
Hier is een voorbeeld van het gebruik van een projectie om de velden te specificeren die moeten worden opgenomen:
db.pets.findOne({}, { name: 1, type: 1 })
Resultaat:
{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
Merk op dat de _id
veld wordt geretourneerd, ook al hebben we het niet in onze projectie opgenomen. Dit veld is een uitzondering en wordt standaard opgenomen.
Als u de _id
. niet wilt veld dat moet worden geretourneerd, moet u dit expliciet uitsluiten.
db.pets.findOne({}, { _id: 0, name: 1, type: 1 })
Resultaat:
{ "name" : "Wag", "type" : "Dog" }
Hier is nog een voorbeeld, deze keer specificeren we alleen welke velden moeten worden uitgesloten.
db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 })
Resultaat:
{ "name" : "Wag", "type" : "Dog" }
Meer projecties
Er zijn verschillende andere dingen die u kunt doen met projecties. Vanaf MongDB 4.4 kunt u bijvoorbeeld aggregatie-expressies gebruiken om de waarde van een geprojecteerd veld op te geven.
Voorbeeld:
db.pets.findOne({}, {
"_id": 0,
"n": "$name",
"t": "$type",
"w": "$weight"
})
Resultaat:
{ "n" : "Wag", "t" : "Dog", "w" : 20 }
Hier hebben we de veldnamen hernoemd. We hebben dit gedaan door voor elk veld een nieuwe naam op te geven als een letterlijke tekenreeks, met behulp van de $fieldName
syntaxis om die veldwaarde uit te voeren. Het resultaat lijkt een beetje op het gebruik van aliassen in SQL.
Meer informatie
Zie de MongoDB-documentatie voor meer informatie.