Jak používat dotazy MongoDB
Dotazy MongoDB vám umožňují rychle a efektivně prohledávat a analyzovat vaši databázi. Struktura metody je logická a můžete s ní použít řadu parametrů.
Jak efektivně vyhledávat v kolekcích
Jako dokumentové řešení NoSQL nabízí MongoDB uživatelům možnost snadno ukládat a spravovat velké a rozmanité objemy dat. Systém správy databází je velmi flexibilní a lze jej snadno horizontálně škálovat.
Na rozdíl od relačních databází jsou data v Mongo DB uložena v dokumentech BSON (binární JSON) a seskupena do kolekcí. Aby tento přístup skutečně fungoval, je důležitémít k dispozici výkonné dotazovací mechanismy, které dokážou prohledat databázi a prezentovat informace, které uživatelé potřebují. S dotazy MongoDB může databáze prohledávat i složitě strukturované kolekce a poskytovat informace, které hledáte.
Je používání shellu pro MongoDB příliš složité? MongoDB Compass je bezplatné grafické uživatelské rozhraní, které usnadňuje práci s MongoDB.
Co jsou dotazy MongoDB?
Dotazy MongoDB jsou uživatelsky přívětivým nástrojem používaným k vyhledávání ve složitých datových strukturách. Řídí se logickými pravidly a fungují podobně jako možnosti filtrování, které najdete na většině webových stránek. To vám umožňuje formulovat vyhledávání co nejpřesněji, abyste dosáhli co nejlepších výsledků. To je obzvláště důležité, protože MongoDB je schopna ukládat mnoho různých typů dat. Bez nezbytných možností filtrování by bylo obtížné spravovat databázi. V následujících částech vysvětlíme, co potřebujete k vytvoření dotazů MongoDB a jak je používat.
Jaké jsou požadavky na dotazy MongoDB?
Pro používání dotazů MongoDB existuje pouze několik požadavků.
- Na svém počítači musíte mít nainstalovaný MongoDB. Databáze funguje na mnoha operačních systémech, takže níže uvedené pokyny platí bez ohledu na to, zda používáte Linux, OS X nebo Windows. Kroky, které následují po instalaci, jsou na všech systémech stejné a týkají se pouze samotné databáze. Jak instalace probíhá, se dozvíte v našem tutoriálu MongoDB.
- K použití vyhledávací funkce potřebujete práva správce.
- Nejlepší je vytvořit testovací prostředí, abyste mohli bez rizika vyzkoušet dotazy Mongo DB.
Jak strukturovat sbírku testů
Nejprve otevřete shell a přihlaste se jako správce. Poté vytvořte novou kolekci, která bude sloužit jako testovací prostředí pro vaše první dotazy MongoDB. Kromě vyhledávání jednoduchých dokumentů může tato metoda vyhledávat také pole, různá pole a vložené dokumenty, proto jsme se rozhodli vytvořit o něco složitější kolekci. Tímto způsobem získáte lepší představu o rozsahu dotazů MongoDB.
Náš příklad sestává ze seznamu zákazníků. Formát tohoto seznamu je následující:
{
"name" : "Schulz",
"units" : 642,
"location" : [ "Germany", "Austria" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2023,
},
"total" : 14
}
}shellTento dokument obsahuje následující informace:
- název: Název společnosti, která zboží zakoupila.
- jednotky: Celkový počet produktů objednaných společností.
- umístění: Umístění společnosti. Pokud má společnost několik poboček, lze je uložit ve formě pole.
- transakce: Toto pole obsahuje další dokument. Dokumenty tohoto typu se označují jako „vložené dokumenty“ nebo „vnořené dokumenty“. Každý z transakčních dokumentů obsahuje informace o tom, jak dlouho je společnost zákazníkem (pod položkou „první“), kdy byla zadána poslední objednávka (pod položkou „poslední“) a celkový počet objednávek produktů společností (pod položkou „celkem“).
V tomto příkladu jsme přidali další dokumenty, aby bylo snazší přidávat informace v pozdější fázi. Tímto způsobem lze zajistit dobrý přehled o informacích v databázi.
Vytvoření testovací kolekce pro dotazy MongoDB
Nyní vytvoříme kolekci s názvem „Zákazníci“. Abychom měli přehled o kolekci, zahrneme do ní pouze pět položek. Pokud používáte dotazy MongoDB pro práci, můžete pomocí metody insertMany vytvořit rozsáhlejší kolekce.
Takto vypadá naše testovací kolekce:
db.customers.insertMany ( [
{
"name" : "Schulz",
"location" : [ "Germany", "Austria" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2023,
},
"total" : 14
}
},
{
"name" : "ATS",
"units" : 17,
"location" : "France",
"transactions" : {
"first" : {
"year" : 2021,
},
"last" : {
"year" : 2022,
},
"total" : 2,
}
},
{
"name" : "Meyer",
"units" : 814,
"location" : [ "Austria", "Germany" ],
"transactions" : {
"first" : {
"year" : 2016,
},
"last" : {
"year" : 2023,
},
"total" : 22,
}
},
{
"name" : "Pawolski",
"units" : 313,
"location" : [ "Germany", "Poland" ],
"transactions" : {
"first" : {
"year" : 2017,
},
"last" : {
"year" : 2020,
},
"total" : 9,
}
},
{
"name" : "Jorgensen",
"units" : 7,
"location" : "Denmark",
"transactions" : {
"first" : {
"year" : 2022,
},
"last" : {
"year" : 2023,
},
"total" : 2,
}
}
] )shellKdyž spustíte tento záznam s daty, která jsme použili (nebo s vašimi vlastními daty), obdržíte seznam ID objektů. Tyto ID jsou jedinečné a zajišťují, že každý dokument lze také najít pomocí odpovídajícího ID. Pokud se chcete ujistit, že všechny dokumenty byly zahrnuty do sbírky, můžete použít MongoDB find bez parametrů:
db.customers.find ( )shellVýstupem je seznam všech ID objektů s kompletními dokumenty. Nyní je můžete prohledávat pomocí dotazů MongoDB.
Jak používat dotazy MongoDB s poli a políčky
Pomocí dotazů MongoDB můžete prohledávat jednotlivá pole, více polí, pole a vnořené dokumenty. V následujících částech se podíváme na každý z nich.
Dotazování jednotlivých polí pomocí dotazů MongoDB
Výstup z MongoDB find ukazuje, jak užitečné mohou být dotazy MongoDB. Náš malý vzorek produkuje výstup s dlouhými řetězci znaků, takže si můžete představit, jaké to je, když pracujete s větším vzorkem.
V následujícím příkladu také použijeme find, ale tentokrát vytvoříme speciální požadavek, který musí dokument splňovat, aby mohl být vygenerován. Konkrétně budeme hledat všechny dokumenty, které obsahují název „ATS“.
db.customers.find (
{ "name" : "ATS" }
)shellJednoduché dotazy MongoDB, jako je tento, nyní prohledají všechny dokumenty v kolekci a vyhledají ty, které mají hodnotu jména „ATS“. To se týká pouze jednoho záznamu v naší kolekci, takže výstup vypadá takto:
db.customers.find ( { "name" : "ATS" } )
{
"_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
"name" : "ATS",
"units" : 17,
"location" : "France",
"transactions" : {
"first" : {
"year" : 2021,
},
"last" : {
"year" : 2022,
},
"total" : 2
}shellFunguje to i opačně. Pokud chcete zobrazit všechny výsledky kromě položky „ATS“, zadejte následující:
db.customers.find (
{ "name" : { $ne : "ATS" } }
)shellPokud chcete vypsat dotazy MongoDB s různými hodnotami, můžete tak učinit pomocí pole. Uděláme to pomocí zákazníků ATS a Jorgensen.
db.customers.find (
{ "name" : [ $in : [ "ATS", "Jorgensen" ] } }
)shellDotazování více polí pomocí dotazů MongoDB
Pokud potřebujete přesné výsledky, je důležité, aby byl váš dotaz konkrétnější. Dotazy v MongoDB můžete zpřesnit pomocí dalších parametrů. Níže uvedeme kromě názvu společnosti „ATS“ také hodnotu ze segmentu „units“. Tímto způsobem náš dotaz vyhledá dokument, který obsahuje obě hodnoty:
db.customers.find (
{ "name" : "ATS", "units" : 17 }
)shellMáme přesnou shodu. Pokud se shoduje pouze jedna z obou hodnot, nebude vypsán žádný výsledek. Zde je příklad dotazu bez výsledků:
db.customers.find (
{ "name" : "ATS", "units" : 25 }
)shellPokud chcete při používání dotazů MongoDB zohlednit různé hodnoty, ale chcete, aby dotaz vygeneroval výsledek i v případě, že je splněna pouze jedna z podmínek, zadejte toto:
db.customers.find (
{ $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)shellDotazování hodnot v polích
V dotazech MongoDB můžete také zohlednit hodnoty v polích. V naší sbírce jsou společnosti, které mají pobočky v několika zemích. Pokud chcete zobrazit všechny společnosti, které mají alespoň jednu pobočku v Německu, můžete zadat následující:
db.customers.find (
{ "location" : "Germany" }
)shellVýstup nyní obsahuje všechny tři zákazníky, kteří mají alespoň jednu pobočku v Německu. Pokud chcete rozšířit svůj vstup a najít společnosti, které mají pobočky v Německu a Rakousku, pomocí stejného dotazu, můžete použít pole:
db.customers.find (
{ "location" : [ "Germany", "Austria" ] }
)shellZjistíte, že vstup zobrazuje pouze jeden výsledek, i když teoreticky vyhledávacím kritériím odpovídají dvě společnosti. Důvodem je to, že dotazy MongoDB se přesně drží zadaného vstupu, včetně pořadí prvků. Pokud chcete, aby metoda zohledňovala hodnoty bez ohledu na pořadí, v jakém se objevují, napište dotaz následovně:
db.customers.find (
{ "location" : { $all : [ "Germany", "Austria" ] } }
)shellDotazování hodnot ve vložených dokumentech
V naší sbírce máme také vložené dokumenty, které lze také vypsat pomocí dotazů MongoDB. K tomu je třeba přidat tečku, aby MongoDB vědělo, že má analyzovat pole ve vnořeném dokumentu. Pokud například chcete seznam všech zákazníků, kteří mají více než deset transakcí, zadejte následující:
db.customers.find (
{ "transactions.total" : { $gt : 10 } }
)shellMongoDB přistupuje k dokumentu „transakce“ a poté vyhledá počet celkových transakcí v poli „celkem“.
Jak omezit výstup dotazů MongoDB
Výstup dotazů MongoDB může být poměrně rozsáhlý, proto může být vhodné omezit výstup pouze na několik polí. K omezení počtu polí zobrazených ve výstupu můžete použít projekce. Ty obsahují hodnotu 1 (pole, která by měla být zahrnuta do výstupu) a 0 (pole, která by neměla být zahrnuta do výstupu).
V následujícím příkladu provedeme dvoudílný dotaz. Nejprve spustíme vyhledávání bez parametrů pomocí metody find. Samotná metoda by vypsala všechna data v kolekci. My však hned poté provedeme projekci, která zohlední pouze pole name.
db.customers.find (
{ }
{ "name" : 1 }
)shellZobrazí se všichni zákazníci, ale výstup bude omezen na názvy společností.
Co jsou kurzory a jak je mohu použít v dotazech MongoDB?
Kurzory umožňují přizpůsobit způsob zobrazení výsledků dotazu Mongo DB, aniž by došlo ke změně skutečných výsledků dotazu. Můžete například omezit počet zobrazených výsledků nebo změnit jejich pořadí. Pokud chcete zobrazit pouze dva výsledky, můžete použít metodu limit. Postupujte takto:
db.customers.find (
{ }
{ "name" : 1 }
).limit ( 2 )shellK seřazení výstupu můžete použít následující záznam. Zobrazí se tři zákazníci, kteří si objednali nejméně produktů:
db.customers.find (
{ }
{ "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )shellChcete-li v databázi vyhledat konkrétní dokument, můžete použít metodu MongoDB findONE. Tuto metodu podrobněji vysvětlujeme v jiném článku našeho digitálního průvodce.