MongoDB tillhandahåller db.collection.find()
metod för att söka efter dokument inom en samling.
db.collection.find()
väljer dokument i en samling och returnerar en markör till de valda dokumenten.
Returnera alla dokument
Det här exemplet returnerar alla dokument från musikerna samling:
db.musicians.find()
Resultat:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }
Den returnerar alla dokument eftersom vi inte skickade några parametrar som filtreringskriterier.
Frågan ovan är en förkortad version av db.musicians.find( {} )
. I ovanstående fråga har vi utelämnat de lockiga klammerparenteserna {}
. Detta är helt giltigt när du arbetar med MongoDB.
Lägg till filtreringskriterier
Du kan filtrera ned resultaten genom att endast ange de kriterier som du är intresserad av.
Till exempel, om vi bara är intresserade av Deep Purple från artisterna samling:
db.artists.find({ artistname : "Deep Purple" })
Resultat:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Formatera resultaten
Du kanske tycker att resultaten ovan är lite svåra att läsa. Dokumentet returneras som en lång rad med text.
Du kan använda pretty()
metod för att formatera resultaten så att de är lite lättare att läsa.
Lägg bara till pretty()
till slutet, så här:
db.artists.find({ artistname : "Deep Purple" }).pretty()
Resultat:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Fler filtreringsalternativ
Här är några fler sätt att filtrera resultat.
Ange AND
Villkor
Du kan ange att endast dokument som innehåller två eller fler angivna värden ska returneras.
I det här exemplet anger vi att endast musiker som spelar trummor och där född före 1950 ska återlämnas. Endast dokument som matchar båda kriterierna kommer att returneras.
db.musicians.find( { instrument: "Drums", born: { $lt: 1950 } } )
Resultat:
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
Ange OR
Villkor
Du kan också ange att antingen det ena eller det andra värdet ska vara sant. Så länge ett av villkoren är sant kommer dokumentet att returneras.
I det här exemplet vill vi ha dokument som innehåller musiker som antingen spelar trummor eller är födda före 1950.
db.musicians.find( { $or: [ { instrument: "Drums" }, { born: { $lt: 1950 } } ] } )
Resultat:
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
$in
Operatör
$in
operatorn låter dig tillhandahålla en lista med värden. Om ett dokument innehåller något av dessa värden kommer det att returneras.
Med hjälp av följande exempel söker vi efter alla musiker som antingen är på sång eller spelar gitarr.
db.musicians.find( { instrument: { $in: [ "Vocals", "Guitar" ] } } )
Resultat
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
Fråga en mängd dokument
Det här exemplet frågar efter en mängd dokument. Den hittar album som släpptes efter år 2000.
db.artists.find( { albums: { $elemMatch: { year: { $gt: 2000 } } } } ).pretty()
Resultat:
{ "_id" : ObjectId("578217c248ef8c6b3ffb015a"), "artistname" : "Robben Ford", "albums" : [ { "album" : "Bringing it Back Home", "year" : 2013, "genre" : "Blues" }, { "album" : "Talk to Your Daughter", "year" : 1988, "genre" : "Blues" } ] } { "_id" : ObjectId("578217c248ef8c6b3ffb015b"), "artistname" : "Snoop Dogg", "albums" : [ { "album" : "Tha Doggfather", "year" : 1996, "genre" : "Rap" }, { "album" : "Reincarnated", "year" : 2013, "genre" : "Reggae" } ] }
Du kommer att märka att dessa resultat även innehåller album från tidigare än 2000. Det är korrekt – det är så dokumentorienterade databaser fungerar. Alla frågor kommer att returnera hela dokumentet (men bara de dokument som matchar de angivna kriterierna).
db.collection.findOne()
Metod
Du kan använda db.collection.findOne()
metod för att returnera ett dokument som uppfyller de angivna frågekriterierna.
Om flera dokument uppfyller kriterierna returneras endast det första, vilket bestäms av den naturliga ordningen för dokumenten på disken.
Så söker en hel samling så här:
db.musicians.findOne( )
Returnerar endast ett dokument:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
Om vi ändrar findOne()
till find()
så här:
db.musicians.find( )
Vi ser att det faktiskt finns 8 dokument i samlingen:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" } { "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 } { "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 } { "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 } { "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 } { "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 } { "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 } { "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }