sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB hitta()

I MongoDB används db.collection.find() metoden väljer dokument i en samling eller vy och returnerar en markör till de valda dokumenten.

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

Du kan använda den för att returnera alla dokument, bara några eller bara ett dokument. Du kan också ange vilka fält som ska returneras.

Det är viktigt att notera att det faktiskt inte returnerar dokumenten. Den returnerar bara en markör till dokumenten. Med det sagt är det lättare att säga att det "returerar dokument", och det hänvisas vanligtvis till på ett sådant sätt - inklusive i den här artikeln 🙂

Returnera alla dokument

Här är ett exempel att visa.

db.pets.find() 

Resultat:

{ "_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 } 

Här använder vi find() metod för att returnera alla dokument från pets samling. Vi vet att detta returnerar alla dokument eftersom vi inte angav några filtreringskriterier. Faktum är att vi inte gav några argument.

När anropas utan argument, find() returnerar alla dokument från en samling och returnerar alla fält för dokumenten.

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

db.pets.find({}) 

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.

Filtrera resultaten

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

db.collection.find(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 resultaten. 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.find({"type":"Dog"}) 

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "typ" :"Hund", "vikt" :10 }

Detta begränsade resultaten till bara de dokument som har en type fält med värdet Dog .

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.find({"weight": { $lt: 10 }}) 

Resultat:

{ "_id" :3, "name" :"Mjau", "type" :"Katt", "vikt" :7 }{ "_id" :4, "name" :"Scratch", "typ" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 }

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.find({ "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.find({ 
    "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.find({ 
    "specs" : {
		"height" : 400
	}
 }) 

Formatera resultaten

Det föregående exemplets resultat returnerades på en rad. Du kan använda cursor.pretty() metod för att konfigurera markören för att visa resultaten i ett mer läsbart format.

För att använda pretty() metod, lägg till den i find() metod.

Exempel:

db.pets.find({ "_id": 6 }).pretty() 

Resultat:

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

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.find({ 
    "awards": "Top Dog"
}).pretty() 

Resultat:

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

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

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

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.find({ 
    "awards.1": "Top Dog"
}).pretty() 

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 find() . 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 find() går så här:

db.collection.find(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).

Vid det här laget innehåller vår samling 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 }{ " _id" :6, "name" :"Hämta", "typ" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brun" } }{ "_id" " :7, "name" :"Jake", "type" :"Hund", "awards" :[ "Top Dog", "Best Dog", "Biggest Dog" ] }

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

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

Resultat:

{ "_id" :1, "name" :"Wag", "type" :"Hund" }{ "_id" :2, "name" :"Bark", "type" :"Hund" }{ "_id" :3, "name" :"Mjau", "type" :"Katt" }{ "_id" :4, "name" :"Scratch", "type" :"Katt" }{ "_id" :5, "name" :"Bruce", "type" :"Bat" }{ "_id" :6, "name" :"Hämta", "type" :"Hund" }{ "_id" :7, "name " :"Jake", "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.find({}, { _id: 0, name: 1, type: 1 }) 

Resultat:

{ "name" :"Wag", "type" :"Hund" }{ "name" :"Bark", "type" :"Hund" }{ "name" :"Mjau", "typ" :"Cat" }{ "name" :"Scratch", "type" :"Cat" }{ "name" :"Bruce", "type" :"Bat" }{ "name" :"Hämta", "typ" :"Hund" }{ "name" :"Jake", "type" :"Hund" }

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

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

Resultat:

{ "name" :"Wag", "type" :"Hund" }{ "name" :"Bark", "type" :"Hund" }{ "name" :"Mjau", "typ" :"Cat" }{ "name" :"Scratch", "type" :"Cat" }{ "name" :"Bruce", "type" :"Bat" }{ "name" :"Hämta", "typ" :"Hund" }{ "name" :"Jake", "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.find({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Resultat:

{ "n" :"Wag", "t" :"Hund", "w" :20 }{ "n" :"Skall", "t" :"Hund", "w" :10 }{ "n" :"Mjau", "t" :"Katt", "w" :7 }{ "n" :"Scratch", "t" :"Katt", "w" :8 }{ "n" :"Bruce", "t" :"Bat", "w" :3 }{ "n" :"Hämta", "t" :"Hund" }{ "n" :"Jake", "t" :"Hund " }

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. Meteorsamlingsuppdatering med traditionellt id

  2. Hitta en sträng i en sträng i SQL

  3. MongoDB-uppdatering med skick

  4. Uppdatera entitet i redis med spring-data-redis