sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB findOne()

I MongoDB är db.collection.findOne() metod returnerar ett dokument som uppfyller de angivna frågekriterierna i samlingen eller vyn.

collection del är namnet på samlingen eller vyn att söka efter.

findOne() liknar find() , förutom att findOne() returnerar endast det första dokumentet som matchar filterkriterierna, enligt den naturliga ordningen som återspeglar ordningen på dokumenten på disken.

find() metod å andra sidan, returnerar alla matchande dokument.

Även findOne() returnerar det faktiska dokumentet, medan find() returnerar endast en markör till varje dokument. Därför kan du inte använda markörmetoder på findOne() som du kan med find() .

Exempel

Anta att vi har en samling som heter pets med följande dokument:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }{ "_id" :3, "name" :"Mjau", "typ" :"Katt", "vikt" :7 }{ "_id" :4, "namn" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 } 

Vi kan använda findOne() för att returnera ett dokument.

db.pets.findOne() 

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }

Här sökte vi igenom alla dokument i pets samling. Vi vet att detta sökte igenom alla dokument eftersom vi inte angav några filtreringskriterier. Vi gav inte ens några argument.

När anropas utan argument, findOne() söker igenom alla dokument från en samling och returnerar alla fält för det matchande dokumentet.

Ett annat sätt att göra ovanstående är så här:

db.pets.findOne({}) 

I det här fallet skickar vi ett tomt dokument.

Genom att lägga till i detta tomma dokument kan vi börja filtrera resultaten.

Ge en fråga

Den faktiska syntaxen för findOne() går så här:

db.collection.findOne(query, projection) 

Det betyder att du kan skicka en fråga som det första argumentet och en projektion som det andra.

Om du skickar en fråga, används den för att filtrera omfattningen av sökningen till bara de dokument som matchar frågan. En fråga är ett dokument som innehåller frågeoperatorer. Som vi såg i föregående exempel returnerar ett tomt dokument alla dokument.

Låt oss begränsa resultaten till en delmängd av dokument i samlingen.

db.pets.findOne({"type":"Cat"}) 

Resultat:

{ "_id" :3, "name" :"Mjau", "type" :"Katt", "vikt" :7 }

Detta begränsade sökningen till bara de dokument som har en type fält med värdet Cat , sedan findOne() returnerade det första dokumentet från det resultatet.

I det här fallet skickade vi helt enkelt ett dokument som filtreringskriterier.

Du kan också använda frågeoperatorer. Dessa låter dig tillämpa mer specifika kriterier på din fråga.

Exempel:

db.pets.findOne({"weight": { $lt: 10 }}) 

Resultat:

{ "_id" :3, "name" :"Mjau", "type" :"Katt", "vikt" :7 }

Inbäddade dokument

Om du har dokument som innehåller inbäddade dokument kan du använda följande metoder för att söka efter data i de inbäddade dokumenten.

  • Pricknotation (t.ex. field.nestedfield: <value> )
  • Inkapslad form (t.ex. { field: { nestedfield: <value> } } ). Observera att det här alternativet endast är tillgängligt från MongoDB 4.4.

Anta att vi infogar följande dokument.

db.pets.insertOne({ "_id" :6, "name" :"Hämta", "typ" :"Hund", "specs" :{ "height" :400, "weight" :15, " color" :"brun" }})

Vi kan använda punktnotation för att fråga i det inbäddade dokumentet.

db.pets.findOne({ "specs.height": 400 }) 

Resultat:

{ "_id" :6, "name" :"Hämta", "typ" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" }}

Följande fråga returnerar samma dokument, förutom att den här gången refererar vi till det inbäddade dokumentet med kapslad form.

db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Resultat:

{ "_id" :6, "name" :"Hämta", "typ" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" }}

När du använder det kapslade formuläret måste frågan matcha hela det inbäddade dokumentet exakt. Till exempel stämmer inte följande fråga:

db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Resultat:

null

Arrayer

Du kan referera till data i matriser genom att referera till matriselementet efter dess index eller dess värde.

Anta att vi infogar följande dokument:

db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Tophund", "Bästa hund", "Största hund " ]})

Om vi ​​ville hitta alla hundar med Top Dog-utmärkelsen kan vi skriva följande fråga (som kommer att returnera ovanstående hund).

db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Resultat:

{ "_id" :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Top Dog", "Best Dog", "Biggest Dog" ]}

Du kan också ange elementindex, så här:

db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

Att göra det kräver att det angivna värdet är vid det angivna indexet. Följande fråga returnerar därför inte samma hund.

db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Observera att arrayer är nollbaserade, så ett index på 0 anger det första elementet, 1 anger det andra elementet och så vidare.

Projektioner

Som standard returneras alla dokumentfält när du använder findOne() . Men du kan använda projektioner för att minska antalet returnerade fält om det behövs.

Du kanske minns att syntaxen för findOne() går så här:

db.collection.findOne(query, projection) 

Där query tillhandahåller filtreringskriterierna (vilket vi har gjort i exemplen ovan) och projection är en valfri projektion som anger vilka fält som ska returneras från matchande dokument. Därför, om vi vill använda en projektion, sätter vi den helt enkelt efter frågan.

När du använder en projektion kan du ange vilka fält som ska inkluderas , fälten som ska uteslutas , eller båda. För att göra detta, lista namnet på fältet och antingen en 1 (för att inkludera det) eller 0 (för att utesluta det).

Här är ett exempel på hur man använder en projektion för att specificera fälten som ska inkluderas:

db.pets.findOne({}, { name: 1, type: 1 }) 

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund" }

Lägg märke till att _id fältet returneras även om vi inte inkluderade det i vår projektion. Detta fält är ett undantag och ingår som standard.

Om du inte vill ha _id fält som ska returneras måste du uttryckligen utesluta det.

db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Resultat:

{ "name" :"Wag", "type" :"Hund" }

Här är ett annat exempel, den här gången anger vi bara vilka fält som ska uteslutas.

db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Resultat:

{ "name" :"Wag", "type" :"Hund" }

Fler projektioner

Det finns olika andra saker du kan göra med projektioner. Till exempel, från MongDB 4.4 kan du använda aggregerade uttryck för att ange värdet på ett projicerat fält.

Exempel:

db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Resultat:

{ "n" :"Wag", "t" :"Hund", "w" :20 }

Här döpte vi om fältnamnen. Vi gjorde detta genom att ange ett nytt namn för varje fält som en bokstavlig sträng, med $fieldName syntax för att mata ut fältvärdet. Resultatet är lite som att använda alias i SQL.

Mer information

Se MongoDB-dokumentationen för mer information.


  1. Räkna i Spring Data MongoDB-förrådet

  2. Bästa sättet att ansluta till MongoDB med Node.js

  3. många till många relationer med nosql (mongodb och mongoose)

  4. Kopiera/klona en databas i MongoDB