A MongoDB lekérdezések segítségével gyorsan és hatékonyan kereshet és elemezheti adatbázisát. A módszer felépítése logikus, és számos paraméterrel használható.

Hogyan lehet hatékonyan keresni a gyűjteményekben?

Dokumentumalapú NoSQL megoldásként a MongoDB lehetővé teszi a felhasználók számára, hogy nagy mennyiségű és sokféle adatot könnyedén tároljanak és kezeljenek. Az adatbázis-kezelő rendszer nagyon rugalmas és könnyen horizontálisan skálázható.

A relációs adatbázisokkal ellentétben a Mongo DB-ben az adatok BSON-dokumentumokban (bináris JSON) vannak tárolva és gyűjteményekbe vannak csomagolva. Ahhoz, hogy ez a megközelítés valóban működjön, fontos, hogyerős lekérdezési mechanizmusok álljanak rendelkezésre, amelyek át tudják vizsgálni az adatbázist és bemutatni a felhasználók számára szükséges információkat. A MongoDB lekérdezésekkel az adatbázis még komplexen felépített gyűjteményeket is át tud kutatni, hogy megtalálja a keresett információkat.

Tipp

Túl bonyolult a MongoDB shell használata? A MongoDB Compass egy ingyenes grafikus felhasználói felület, amely megkönnyíti a MongoDB használatát.

Mik azok a MongoDB lekérdezések?

A MongoDB lekérdezések egy felhasználóbarát eszköz, amelyet komplex adatstruktúrák keresésére használnak. Logikai szabályokat követnek, és úgy működnek, mint a legtöbb weboldalon található szűrőopciók. Ez lehetővé teszi, hogy a keresést a lehető legpontosabban megfogalmazza, így a legjobb eredményeket érheti el. Ez különösen fontos, mivel a MongoDB sokféle adatot képes tárolni. A szükséges szűrőopciók nélkül nehéz lenne kezelni az adatbázist. A következő szakaszokban elmagyarázzuk, mire van szükség a MongoDB lekérdezések létrehozásához, és hogyan kell azokat használni.

Milyen követelmények vonatkoznak a MongoDB lekérdezésekre?

A MongoDB lekérdezések használatához csak néhány követelménynek kell megfelelni.

  1. A MongoDB-t telepítenie kell a számítógépére. Az adatbázis számos operációs rendszeren működik, így az alábbi utasítások Linux, OS X vagy Windows rendszeren egyaránt alkalmazhatók. A telepítés utáni lépések minden rendszeren megegyeznek, és csak az adatbázist érintik. A telepítés menetét a MongoDB bemutatóban találja meg.
  2. A keresési funkció használatához rendszergazdai jogok szükségesek.
  3. A legjobb, ha létrehoz egy tesztkörnyezetet, hogy kockázat nélkül kipróbálhassa a Mongo DB lekérdezéseket.

Hogyan kell felépíteni egy tesztgyűjteményt?

Először nyissa meg a parancssort, és jelentkezzen be rendszergazdaként. Ezután hozzon létre egy új gyűjteményt, amely tesztkörnyezetként fog szolgálni az első MongoDB lekérdezéseihez. Az egyszerű dokumentumok keresése mellett a módszer tömböket, különböző mezőket és beágyazott dokumentumokat is képes keresni, ezért úgy döntöttünk, hogy egy kissé bonyolultabb gyűjteményt hozunk létre. Így jobban megismerheti a MongoDB lekérdezések hatókörét.

Példánk egy ügyféllistából áll. A lista formátuma a következő:

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

Ez a dokumentum a következő információkat tartalmazza:

  • név: Az árukat megvásárló vállalat neve.
  • egységek: A vállalat által megrendelt termékek teljes száma.
  • location: A vállalat székhelye. Ha több fióktelepe van, ezek tömb formájában menthetők el.
  • tranzakciók: Ez a mező egy további dokumentumot tartalmaz. Az ilyen dokumentumokat „beágyazott dokumentumoknak” vagy „beágyazott dokumentumoknak” nevezik. Minden tranzakciós dokumentum tartalmaz információkat arról, hogy a vállalat mióta ügyfél (az „első” tétel alatt), mikor történt az utolsó megrendelés (a „utolsó” tétel alatt) és hányszor rendelt termékeket a vállalat (a „teljes” tétel alatt).

Ebben a példában további dokumentumokat adtunk hozzá, hogy később könnyebben lehessen információkat beilleszteni. Ez segít biztosítani a adatbázisban található információk jó áttekinthetőségét.

Tesztgyűjtemény létrehozása MongoDB lekérdezésekhez

Most létrehozunk egy „Customers” nevű gyűjteményt. Annak érdekében, hogy könnyen áttekinthető legyen a gyűjtemény, csak öt bejegyzést fogunk felvenni. Ha munkád során MongoDB lekérdezéseket használsz, a insertMany módszerrel kiterjedtebb gyűjteményeket hozhatsz létre.

Így néz ki a tesztgyűjteményünk:

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

Ha ezt a bejegyzést a mi általunk használt adatokkal (vagy a saját adataival) futtatja, akkor egy objektumazonosítók listáját kapja vissza. Ezek egyedi azonosítók, amelyek biztosítják, hogy minden dokumentum a megfelelő azonosítóval is megtalálható legyen. Ha meg akar győződni arról, hogy az összes dokumentum bekerült a gyűjteménybe, akkor használhatja a MongoDB find parancsot paraméterek nélkül:

db.customers.find ( )
shell

Az eredmény egy lista az összes objektumazonosítóról a teljes dokumentumokkal együtt. Most már MongoDB lekérdezésekkel kereshet bennük.

Hogyan használjuk a MongoDB lekérdezéseket mezőkkel és tömbökkel?

A MongoDB lekérdezésekkel egyedi mezőket, több mezőt, tömböket és beágyazott dokumentumokat kereshet. Az alábbi szakaszokban mindegyiket részletesen megvizsgáljuk.

Egyedi mezők lekérdezése MongoDB lekérdezésekkel

A MongoDB find kimenete jól mutatja, milyen hasznosak lehetnek a MongoDB lekérdezések. Kis mintánk hosszú karakterláncokat tartalmazó kimenetet eredményez, így elképzelhető, milyen lehet ez egy nagyobb mintával dolgozni.

A következő példában szintén find fogjuk használni, de ezúttal egy speciális követelményt fogunk létrehozni, amelyet a dokumentumoknak teljesíteniük kell ahhoz, hogy kinyomtathatók legyenek. Konkrétan, az összes olyan dokumentumot fogjuk keresni, amelynek neve „ATS”.

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

Az ilyen egyszerű MongoDB lekérdezések mostantól a gyűjtemény összes dokumentumát átkutatják, és kiválasztják azokat, amelyek neve „ATS”. Ez csak a gyűjteményünk egy bejegyzésére vonatkozik, így a kimenet a következőképpen néz ki:

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

A fordított eljárás is működik. Ha az „ATS” bejegyzés kivételével az összes eredményt meg szeretné jeleníteni, írja be a következőket:

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

Ha különböző értékekkel szeretné kinyomtatni a MongoDB lekérdezéseket, akkor ezt egy tömb segítségével teheti meg. Ehhez a customers ATS és Jorgensen adatokat fogjuk használni.

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

Több mező lekérdezése MongoDB lekérdezésekkel

1

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

Pontosan egyezik. Ha csak az egyik érték egyezik, akkor nem jelenik meg eredmény. Íme egy példa eredmény nélküli lekérdezésre:

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

Ha a MongoDB lekérdezések használatakor különböző értékeket szeretne figyelembe venni, de azt szeretné, hogy a lekérdezés akkor is eredményt adjon, ha csak az egyik feltétel teljesül, írja be a következőket:

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

Értékek lekérdezése tömbökben

A MongoDB lekérdezésekkel a tömbökben szereplő értékeket is figyelembe vehetjük. Gyűjteményünkben vannak olyan cégek, amelyek több országban is rendelkeznek fióktelepekkel. Ha ki szeretnénk adni az összes olyan céget, amelynek legalább egy fióktelepe van Németországban, akkor a következőket adhatjuk meg:

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

A kimenet most már mindhárom ügyfelet tartalmazza, akiknek legalább egy fiókja van Németországban. Ha bővíteni szeretné a bemenetet, és ugyanazzal a lekérdezéssel olyan vállalatokat szeretne megtalálni, amelyeknek Németországban és Ausztriában is vannak fiókjaik, akkor használhat egy tömböt:

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

Észreveheted, hogy a beviteli mező csak egy eredményt jelenít meg, annak ellenére, hogy elvileg két vállalat is megfelel a keresési feltételeknek. Ennek oka, hogy a MongoDB lekérdezések pontosan a megadott beviteli adatokhoz igazodnak, beleértve az elemek sorrendjét is. Ha azt szeretnéd, hogy a módszer a megjelenésük sorrendjétől függetlenül vegye figyelembe az értékeket, írd meg a lekérdezést az alábbiak szerint:

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

Értékek lekérdezése beágyazott dokumentumokban

Gyűjteményünkben vannak beágyazott dokumentumok is, amelyek MongoDB lekérdezésekkel is kinyomtathatók. Ehhez egy pontot kell hozzáadni, hogy jelezze a MongoDB-nek, hogy egy beágyazott dokumentum mezőjét elemezni kell. Például, ha az összes olyan ügyfél listáját szeretné megkapni, akiknek több mint tíz tranzakciója van, írja be a következőket:

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

A MongoDB hozzáfér a „transactions” dokumentumhoz, majd a „total” alatt megkeresi a teljes tranzakciók számát.

Hogyan lehet korlátozni a MongoDB lekérdezések kimenetét?

A MongoDB lekérdezések kimenete meglehetősen kiterjedt lehet, ezért érdemes lehet a kimenetet néhány mezőre korlátozni. A kimenetben megjelenő mezők számát projekciók segítségével lehet korlátozni. Ezek az 1 (a kimenetben szerepelni kívánt mezők) és a 0 (a kimenetben nem szerepelni kívánt mezők) értéket tartalmazzák.

A következő példában egy kétrészes lekérdezést fogunk végrehajtani. Először a find metódussal paraméterek nélküli keresést indítunk. Ez önmagában a gyűjtemény összes adatát kiadná. Azonban ezt azonnal egy olyan vetítés követi, amely csak a név mezőt veszi figyelembe.

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

Az összes ügyfél megjelenik, de a kimenet a vállalatok nevére korlátozódik.

Mik azok a kurzorok és hogyan használhatom őket a MongoDB lekérdezésekben?

A kurzorok lehetővé teszik a Mongo DB lekérdezési eredmények megjelenítésének testreszabását anélkül, hogy a lekérdezés tényleges eredményeit megváltoztatnák. Például korlátozhatja a megjelenített eredmények számát, vagy megváltoztathatja azok sorrendjét. Ha csak két eredményt szeretne megjeleníteni, használhatja a limit módszert. Így kell csinálni:

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

A kimenet rendezéséhez használhatja a következő bejegyzést. Ezzel a legkevesebb terméket rendelő három ügyfél jelenik meg:

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

Ha egy adott dokumentumot szeretne megtalálni az adatbázisában, használhatja a MongoDB findONE módszert. Ezt a módszert részletesebben egy másik cikkünkben ismertetjük a Digitális útmutatónkban.

Ugrás a főmenübe