Dotazy MongoDB vám umožňujú rýchlo a efektívne vyhľadávať a analyzovať vašu databázu. Štruktúra metódy je logická a môžete s ňou používať množstvo parametrov.

Ako efektívne vyhľadávať v zbierkach

Ako dokumentové riešenie NoSQL, MongoDB poskytuje používateľom možnosť jednoducho ukladať a spravovať veľké a rôznorodé množstvá údajov. Systém správy databázy je veľmi flexibilný a dá sa ľahko horizontálne škálovať.

Na rozdiel od relačných databáz sú údaje v Mongo DB uložené v dokumentoch BSON (binárny JSON) a zoskupené do zbierok. Aby tento prístup skutočne fungoval, je dôležitémať silné mechanizmy vyhľadávania, ktoré dokážu prechádzať databázu a prezentovať informácie, ktoré používatelia potrebujú. S vyhľadávaním MongoDB môže databáza vyhľadávať aj v komplexne štruktúrovaných zbierkach, aby poskytla informácie, ktoré hľadáte.

Tip

Je používanie shellu pre MongoDB príliš zložité? MongoDB Compass je bezplatné grafické používateľské rozhranie, ktoré uľahčuje navigáciu v MongoDB.

Čo sú to dotazy MongoDB?

Dotazy MongoDB sú užívateľsky prívetivým nástrojom používaným na vyhľadávanie komplexných dátových štruktúr. Dodržiavajú logické pravidlá a fungujú podobne ako filtre, ktoré nájdete na väčšine webových stránok. To vám umožňuje formulovať vyhľadávanie čo najpresnejšie, aby ste dosiahli čo najlepšie výsledky. Je to obzvlášť dôležité, pretože MongoDB je schopný ukladať mnoho rôznych typov dát. Bez potrebných filtrov by bolo ťažké spravovať databázu. V nasledujúcich častiach vysvetlíme, čo potrebujete na vytvorenie dotazov MongoDB a ako ich používať.

Aké sú požiadavky na dotazy MongoDB?

Na používanie dotazov MongoDB je potrebných len niekoľko požiadaviek.

  1. Na vašom počítači musíte mať nainštalovaný MongoDB. Databáza funguje na mnohých operačných systémoch, takže nižšie uvedené pokyny platia bez ohľadu na to, či používate Linux, OS X alebo Windows. Kroky, ktoré nasledujú po inštalácii, sú rovnaké na všetkých systémoch a týkajú sa iba samotnej databázy. Informácie o tom, ako inštalácia prebieha, nájdete v našom tutoriáli MongoDB.
  2. Na používanie vyhľadávacej funkcie potrebujete práva správcu.
  3. Najlepšie je vytvoriť testovacie prostredie, aby ste mohli bez rizika vyskúšať dotazy Mongo DB.

Ako štruktúrovať zbierku testov

Najskôr otvorte shell a prihláste sa ako správca. Potom vytvorte novú kolekciu, ktorá bude slúžiť ako testovacie prostredie pre vaše prvé dotazy MongoDB. Okrem vyhľadávania jednoduchých dokumentov môže táto metóda vyhľadávať aj polia, rôzne polia a vložené dokumenty, preto sme sa rozhodli vytvoriť o niečo zložitejšiu kolekciu. Takto získate lepšiu predstavu o rozsahu dotazov MongoDB.

Náš príklad pozostáva zo zoznamu zákazníkov. Formát tohto zoznamu je nasledovný:

{
    "name" : "Schulz",
    "units" : 642,
    "location" : [ "Germany", "Austria" ],
    "transactions" : {
        "first" : {
            "year" : 2017,
        },
        "last" : {
            "year" : 2023,
        },
        "total" : 14
    }
}
shell

Tento dokument obsahuje nasledujúce informácie:

  • názov: Názov spoločnosti, ktorá tovar zakúpila.
  • jednotky: Celkový počet produktov objednaných spoločnosťou.
  • location: Miesto, kde sa spoločnosť nachádza. Ak má spoločnosť viacero pobočiek, môžu byť uložené vo forme poľa.
  • transakcie: Toto pole obsahuje ďalší dokument. Dokumenty tohto typu sa nazývajú „vložené dokumenty“ alebo „vnořené dokumenty“. Každý z transakčných dokumentov obsahuje informácie o tom, ako dlho je spoločnosť zákazníkom (v položke „prvý“), kedy bola zadaná posledná objednávka (v položke „posledný“) a celkový počet objednávok produktov spoločnosťou (v položke „celkom“).

V tomto príklade sme pridali ďalšie dokumenty, aby bolo jednoduchšie neskôr doplniť informácie. Týmto spôsobom je možné zabezpečiť dobrý prehľad o informáciách v databáze.

Vytvorenie testovacej kolekcie pre dotazy MongoDB

Teraz vytvoríme kolekciu s názvom „Zákazníci“. Aby sme mali prehľad o kolekcii, zahrnieme do nej len päť záznamov. Ak používate dotazy MongoDB v práci, môžete pomocou metódy insertMany vytvoriť rozsiahlejšie kolekcie.

Takto vyzerá naša testovacia kolekcia:

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,
    }
}
] )
shell

Keď spustíte tento záznam s údajmi, ktoré sme použili (alebo s vašimi vlastnými údajmi), dostanete zoznam identifikátorov objektov. Tieto identifikátory sú jedinečné a zabezpečujú, že každý dokument je možné nájsť aj prostredníctvom príslušného identifikátora. Ak sa chcete uistiť, že všetky dokumenty boli zahrnuté do zbierky, môžete použiť MongoDB find bez parametrov:

db.customers.find ( )
shell

Výstupom je zoznam všetkých ID objektov s kompletnými dokumentmi. Teraz ich môžete vyhľadávať pomocou dotazov MongoDB.

Ako používať dotazy MongoDB s poľami a polami

Pomocou dotazov MongoDB môžete vyhľadávať jednotlivé polia, viaceré polia, polia a vložené dokumenty. V nasledujúcich častiach sa pozrieme na každú z týchto možností.

Dotazovanie jednotlivých polí pomocou dotazov MongoDB

Výstup z MongoDB find ukazuje, ako užitočné môžu byť dotazy MongoDB. Naša malá vzorka produkuje výstup s dlhými reťazcami znakov, takže si môžete predstaviť, ako to vyzerá, ak pracujete s väčšou vzorkou.

V nasledujúcom príklade použijeme tiež find, ale tentoraz vytvoríme špeciálnu požiadavku, ktorú musí dokument spĺňať, aby bol vygenerovaný. Konkrétne budeme hľadať všetky dokumenty, ktoré majú názov „ATS“.

db.customers.find (
    { "name" : "ATS" }
)
shell

Jednoduché dotazy MongoDB, ako je tento, teraz vyhľadajú všetky dokumenty v zbierke a nájdu tie, ktoré majú hodnotu mena „ATS“. To sa týka len jednej položky v našej zbierke, takže výstup vyzerá takto:

db.customers.find ( { "name" : "ATS" } )
{
    "_id" : ObjectID ( "673d14684o75iftbb0ct5003" ),
    "name" : "ATS",
    "units" : 17,
    "location" : "France",
    "transactions" : {
        "first" : {
            "year" : 2021,
        },
        "last" : {
            "year" : 2022,
        },
        "total" : 2
    }
shell

Funguje to aj naopak. Ak chcete zobraziť všetky výsledky okrem záznamu „ATS“, zadajte nasledujúce:

db.customers.find (
    { "name" : { $ne : "ATS" } }
)
shell

Ak chcete vygenerovať dotazy MongoDB s rôznymi hodnotami, môžete tak urobiť pomocou poľa. Urobíme to pomocou zákazníkov ATS a Jorgensen.

db.customers.find (
    { "name" : [ $in : [ "ATS", "Jorgensen" ] } }
)
shell

Dotazovanie viacerých polí pomocou dotazov MongoDB

Ak potrebujete presné výsledky, je dôležité, aby ste svoj dotaz spresnili. Dotazy v MongoDB môžete spresniť pomocou dodatočných parametrov. Nižšie uvedieme hodnotu zo segmentu „units“ okrem názvu spoločnosti „ATS“. Týmto spôsobom náš dotaz vyhľadá dokument, ktorý obsahuje obe hodnoty:

db.customers.find (
    { "name" : "ATS", "units" : 17 }
)
shell

Máme presnú zhodu. Ak sa zhoduje len jedna z dvoch hodnôt, výsledok sa nezobrazí. Tu je príklad dopytu bez výsledkov:

db.customers.find (
    { "name" : "ATS", "units" : 25 }
)
shell

Ak chcete pri používaní dotazov MongoDB zohľadniť rôzne hodnoty, ale chcete, aby dotaz vygeneroval výsledok aj v prípade, že je splnená len jedna z požiadaviek, zadajte toto:

db.customers.find (
    { $or : [ {"name" : "ATS"}, { "units" : 25 } ] }
)
shell

Dotazovanie hodnôt v poliach

Pri dotazoch MongoDB môžete zohľadniť aj hodnoty v poliach. V našej zbierke sú spoločnosti, ktoré majú pobočky v niekoľkých krajinách. Ak chcete zobraziť všetky spoločnosti, ktoré majú aspoň jednu pobočku v Nemecku, môžete zadať nasledujúce:

db.customers.find (
    { "location" : "Germany" }
)
shell

Výstup teraz obsahuje všetkých troch zákazníkov, ktorí majú aspoň jednu pobočku v Nemecku. Ak chcete rozšíriť svoj vstup a nájsť spoločnosti, ktoré majú pobočky v Nemecku a Rakúsku pomocou rovnakého dopytu, môžete použiť pole:

db.customers.find (
    { "location" : [ "Germany", "Austria" ] }
)
shell

Zistíte, že vstup zobrazuje len jeden výsledok, hoci teoreticky dve spoločnosti zodpovedajú vyhľadávacím kritériám. Dôvodom je to, že dotazy MongoDB sa presne držia zadaného vstupu, ktorý zahŕňa poradie prvkov. Ak chcete, aby metóda zohľadňovala hodnoty bez ohľadu na poradie, v akom sa zobrazujú, napíšte dotaz takto:

db.customers.find (
    { "location" : { $all : [ "Germany", "Austria" ] } }
)
shell

Dotazovanie hodnôt vo vložených dokumentoch

V našej zbierke máme tiež vložené dokumenty, ktoré je možné takisto vygenerovať pomocou dopytov MongoDB. Na to je potrebné pridať bodku, aby sa MongoDB dalo signál, že pole vo vloženej dokumentácii má byť analyzované. Ak napríklad chcete zoznam všetkých zákazníkov, ktorí majú viac ako desať transakcií, zadajte nasledujúce:

db.customers.find (
    { "transactions.total" : { $gt : 10 } }
)
shell

MongoDB pristupuje k dokumentu „transakcie“ a potom vyhľadáva počet celkových transakcií v položke „celkom“.

Ako obmedziť výstup dotazov MongoDB

Výstup dotazov MongoDB môže byť pomerne rozsiahly, preto môže mať zmysel obmedziť výstup len na niekoľko polí. Na obmedzenie počtu polí zobrazených vo výstupe môžete použiť projekcie. Tieto obsahujú hodnotu 1 (polia, ktoré by mali byť zahrnuté do výstupu) a 0 (polia, ktoré by nemali byť zahrnuté do výstupu).

V nasledujúcom príklade vykonáme dvojdielnu požiadavku. Najskôr spustíme vyhľadávanie bez parametrov pomocou metódy find. Samotná metóda by vygenerovala všetky údaje v zbierke. Ihneď po nej však nasleduje projekcia, ktorá zohľadňuje iba pole názvu.

db.customers.find (
    { }
    { "name" : 1 }
)
shell

Zobrazia sa všetci zákazníci, ale výstup bude obmedzený na názvy spoločností.

Čo sú kurzory a ako ich môžem používať v dotazoch MongoDB?

Kurzory ponúkajú spôsob, ako prispôsobiť zobrazenie výsledkov dotazu Mongo DB bez zmeny skutočných výsledkov dotazu. Môžete napríklad obmedziť počet zobrazených výsledkov alebo zmeniť ich poradie. Ak chcete zobraziť len dva výsledky, môžete použiť metódu limit. Postupujte takto:

db.customers.find (
    { }
    { "name" : 1 }
).limit ( 2 )
shell

Na zoradenie výstupu môžete použiť nasledujúci záznam. Zobrazí sa tak trojica zákazníkov, ktorí si objednali najmenej produktov:

db.customers.find (
    { }
    { "name" : 1 }
).limit ( 2 ) .sort ( { "units" : 1 } )
shell
Tip

Na vyhľadanie konkrétneho dokumentu vo vašej databáze môžete použiť metódu MongoDB findONE. Túto metódu podrobnejšie vysvetľujeme v inom článku v našom digitálnom sprievodcovi.

Prejsť na hlavné menu