MongoDB poskytuje db.collection.find()
metoda dotazování dokumentů v rámci kolekce.
db.collection.find()
vybere dokumenty v kolekci a vrátí kurzor na vybrané dokumenty.
Vrátit všechny dokumenty
Tento příklad vrátí všechny dokumenty od hudebníků kolekce:
db.musicians.find()
Výsledek:
{ "_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 }
Vrací všechny dokumenty, protože jsme jako kritéria filtrování nepředali žádné parametry.
Výše uvedený dotaz je zkrácenou verzí db.musicians.find( {} )
. Ve výše uvedeném dotazu jsme vynechali složené závorky {}
. To dokonale platí při práci s MongoDB.
Přidat kritéria filtrování
Výsledky můžete filtrovat tak, že zadáte pouze kritéria, která vás zajímají.
Pokud nás například zajímá pouze Deep Purple od umělců kolekce:
db.artists.find({ artistname : "Deep Purple" })
Výsledek:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Formátování výsledků
Výše uvedené výsledky se vám mohou zdát trochu obtížně čitelné. Dokument je vrácen jako jeden dlouhý řádek textu.
Můžete použít pretty()
způsob formátování výsledků tak, aby byly o něco snadněji čitelné.
Stačí připojit pretty()
do konce, takhle:
db.artists.find({ artistname : "Deep Purple" }).pretty()
Výsledek:
{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }
Další možnosti filtrování
Zde je několik dalších způsobů filtrování výsledků.
Uveďte AND
Podmínky
Můžete určit, že mají být vráceny pouze dokumenty obsahující dvě nebo více zadaných hodnot.
V tomto příkladu specifikujeme, že pouze hudebníci, kteří hrají na bicí a kam by se měli vrátit narození před rokem 1950. Budou vráceny pouze dokumenty, které splňují obě kritéria.
db.musicians.find( { instrument: "Drums", born: { $lt: 1950 } } )
Výsledek:
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
Uveďte OR
Podmínky
Můžete také určit, že jedna nebo druhá hodnota by měla být pravdivá. Pokud je splněna jedna z podmínek, dokument bude vrácen.
V tomto příkladu chceme dokumenty, které obsahují hudebníky, kteří buď hrají na bicí, nebo se narodili před rokem 1950.
db.musicians.find( { $or: [ { instrument: "Drums" }, { born: { $lt: 1950 } } ] } )
Výsledek:
{ "_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
Operátor
$in
operátor umožňuje poskytnout seznam hodnot. Pokud dokument obsahuje některou z těchto hodnot, bude vrácen.
Pomocí následujícího příkladu hledáme všechny hudebníky, kteří buď zpívají, nebo hrají na kytaru.
db.musicians.find( { instrument: { $in: [ "Vocals", "Guitar" ] } } )
Výsledek
{ "_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 }
Dotaz na pole dokumentů
Tento příklad se dotazuje na pole dokumentů. Najde alba, která byla vydána po roce 2000.
db.artists.find( { albums: { $elemMatch: { year: { $gt: 2000 } } } } ).pretty()
Výsledek:
{ "_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" } ] }
Všimnete si, že tyto výsledky obsahují také alba z doby před rokem 2000. To je správné – takto fungují databáze orientované na dokumenty. Jakýkoli dotaz vrátí celý dokument (ale pouze ty dokumenty, které splňují zadaná kritéria).
db.collection.findOne()
Metoda
Můžete použít db.collection.findOne()
metoda pro vrácení jednoho dokumentu, který splňuje zadaná kritéria dotazu.
Pokud kritéria splňuje více dokumentů, vrátí se pouze první z nich, jak je určeno přirozeným pořadím dokumentů na disku.
Takže hledat celou sbírku takto:
db.musicians.findOne( )
Vrátí pouze jeden dokument:
{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
Pokud změníme findOne()
na find()
takhle:
db.musicians.find()
Vidíme, že ve sbírce je ve skutečnosti 8 dokumentů:
{ "_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 }