MongoDB užklausos leidžia greitai ir efek­ty­viai ieškoti ir ana­li­zuo­ti duomenų bazę. Metodo struktūra yra logiška, ir jūs galite naudoti daugybę parametrų.

Kaip efek­ty­viai ieškoti ko­lek­ci­jo­se

Kaip do­ku­men­tais pagrįstas NoSQL spren­di­mas, MongoDB suteikia var­to­to­jams galimybę lengvai saugoti ir valdyti didelius ir įvairius duomenų kiekius. Duomenų bazių valdymo sistema yra labai lanksti ir ją galima lengvai išplėsti ho­ri­zon­ta­liai.

Skir­tin­gai nei re­lia­ci­nė­se duomenų bazėse, Mongo DB duomenys saugomi BSON do­ku­men­tuo­se (bi­na­ri­nia­me JSON) ir su­gru­puo­ti į ko­lek­ci­jas. Kad šis metodas tikrai veiktų, svarbuturėti galingus užklausų me­cha­niz­mus, kurie gali išrinkti duomenų bazę ir pateikti var­to­to­jams rei­ka­lin­gą in­for­ma­ci­ją. Naudojant MongoDB užklausas, duomenų bazė gali ieškoti net su­dė­tin­gos struk­tū­ros ko­lek­ci­jo­se, kad pateiktų jums rei­ka­lin­gą in­for­ma­ci­ją.

Tip

Ar MongoDB apvalkalo nau­do­ji­mas yra pernelyg su­dė­tin­gas? MongoDB Compass yra nemokama grafinė vartotojo sąsaja, kuri pa­leng­vi­na na­vi­ga­ci­ją MongoDB.

Kas yra MongoDB užklausos?

MongoDB užklausos yra patogi priemonė, skirta sudėtingų duomenų struktūrų paieškai. Jos atitinka logines taisykles ir veikia kaip fil­t­ra­vi­mo parinktys, kurias galima rasti daugelyje tink­la­la­pių. Tai leidžia kuo tiksliau su­for­mu­luo­ti paiešką, kad būtų galima pasiekti ge­riau­sius galimus re­zul­ta­tus. Tai ypač svarbu, nes MongoDB gali saugoti daug įvairių tipų duomenų. Be reikiamų fil­t­ra­vi­mo parinkčių būtų sunku valdyti duomenų bazę. Toliau pa­aiš­kin­si­me, ko reikia norint sukurti MongoDB užklausas ir kaip jas naudoti.

Kokie yra MongoDB užklausų rei­ka­la­vi­mai?

Yra tik keletas rei­ka­la­vi­mų, norint naudoti MongoDB užklausas.

  1. Jūsų kom­piu­te­ry­je turi būti įdiegta MongoDB. Duomenų bazė veikia daugelyje ope­ra­ci­nių sistemų, todėl toliau pateiktos inst­ruk­ci­jos tinka tiek Linux, tiek OS X, tiek Windows ope­ra­ci­nėms sistemoms. Po įdiegimo veiksmai yra vienodi visose sistemose ir susiję tik su pačia duomenų baze. Kaip įdiegti programą, galite sužinoti mūsų MongoDB pamokoje.
  2. Norėdami naudotis paieškos funkcija, turite turėti ad­mi­nist­ra­to­riaus teises.
  3. Geriausia sukurti bandomąją aplinką, kad ga­lė­tu­mė­te išbandyti Mongo DB užklausas be rizikos.

Kaip struk­tū­ri­zuo­ti testų rinkinį

Pir­miau­sia ati­da­ry­ki­te apvalkalą ir pri­si­jun­ki­te kaip ad­mi­nist­ra­to­rius. Tada sukurkite naują kolekciją, kuri bus jūsų pirmųjų MongoDB užklausų bandymo aplinka. Be paprastų dokumentų paieškos, šis metodas taip pat gali ieškoti masyvų, įvairių laukų ir įterptųjų dokumentų, todėl nu­spren­dė­me sukurti šiek tiek su­dė­tin­ges­nę kolekciją. Taip geriau suprasite MongoDB užklausų apimtį.

Mūsų pavyzdys susideda iš klientų sąrašo. Šio sąrašo formatas yra toks:

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

Šiame dokumente pa­tei­kia­ma ši in­for­ma­ci­ja:

  • pa­va­di­ni­mas: prekes įsi­gi­ju­sios įmonės pa­va­di­ni­mas.
  • vienetai: bendras įmonės užsakytų produktų skaičius.
  • vietovė: įmonės vietovė. Jei yra keletas filialų, jie gali būti išsaugoti masyvo forma.
  • sandoriai: Šiame laukelyje yra pa­pil­do­mas do­ku­men­tas. Tokie do­ku­men­tai vadinami „įterptais do­ku­men­tais“ arba „įterptais do­ku­men­tais“. Kiek­vie­na­me sandorio dokumente yra in­for­ma­ci­ja apie tai, kiek laiko įmonė yra klientas (pagal „pirmasis“ punktas), kada buvo pateiktas pas­ku­ti­nis užsakymas (pagal „pas­ku­ti­nis“ punktas) ir bendras kartų skaičius, kurį įmonė užsakė produktus (pagal „bendras“ punktas).

Šiame pavyzdyje pridėjome pa­pil­do­mus do­ku­men­tus, kad vėliau būtų lengviau įtraukti in­for­ma­ci­ją. Tai padeda už­tik­rin­ti gerą duomenų bazės in­for­ma­ci­jos apžvalgą.

MongoDB užklausų testų rinkinio kūrimas

Dabar sukursime kolekciją pa­va­di­ni­mu „Klientai“. Kad būtų lengviau per­žiū­rė­ti kolekciją, įtrauk­si­me tik penkis įrašus. Jei darbe naudojate MongoDB užklausas, galite sukurti iš­sa­mes­nes ko­lek­ci­jas naudodami insertMany metodą.

Štai kaip atrodo mūsų bandymų rinkinys:

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

Kai paleisite šį įrašą su mūsų naudotais duo­me­ni­mis (arba su savo duo­me­ni­mis), gausite objektų ID sąrašą. Šie ID yra unikalūs ir užtikrina, kad kiekvieną dokumentą taip pat galima rasti pagal ati­tin­ka­mą ID. Jei norite įsi­ti­kin­ti, kad visi do­ku­men­tai buvo įtraukti į kolekciją, galite naudoti MongoDB find be parametrų:

db.customers.find ( )
shell

Re­zul­ta­tas yra visų objektų ID sąrašas su išsamiais do­ku­men­tais. Dabar juos galite ieškoti naudodami MongoDB užklausas.

Kaip naudoti MongoDB užklausas su laukais ir masyvais

MongoDB užklausas galite naudoti at­ski­riems laukams, keliems laukams, masyvams ir įterp­tie­siems do­ku­men­tams ieškoti. Toliau pa­teik­tuo­se skyriuose ap­žvelg­si­me kiekvieną iš jų.

Atskirų laukų užklausa naudojant MongoDB užklausas

MongoDB find išvestis rodo, kaip naudingos gali būti MongoDB užklausos. Mūsų nedidelis pavyzdys sukuria išvestį su ilgomis simbolių eilutėmis, todėl galite įsi­vaiz­duo­ti, kaip atrodytų didesnis pavyzdys.

Šiame pavyzdyje taip pat naudosime find, tačiau šį kartą nu­sta­ty­si­me specialų rei­ka­la­vi­mą, kurį do­ku­men­tas turi atitikti, kad būtų išvestas. Konk­re­čiai, ieškosime visų dokumentų, kurių pa­va­di­ni­me yra žodis „ATS“.

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

Tokios paprastos MongoDB užklausos dabar ieškos visų dokumentų ko­lek­ci­jo­je ir atitiks tuos, kurių pa­va­di­ni­mo vertė yra „ATS“. Tai taikoma tik vienam įrašui mūsų ko­lek­ci­jo­je, todėl re­zul­ta­tas atrodo taip:

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

At­virkš­ti­nis būdas taip pat veikia. Jei norite rodyti visus re­zul­ta­tus, išskyrus įrašą „ATS“, įveskite šią komandą:

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

Jei norite išvesti MongoDB užklausas su skir­tin­go­mis reikš­mė­mis, galite tai padaryti naudodami masyvą. Tai pa­da­ry­si­me naudodami klientus ATS ir Jorgensen.

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

Kelių laukų užklausa naudojant MongoDB užklausas

Jei jums reikia tikslių rezultatų, svarbu, kad jūsų užklausa būtų kuo konk­re­tes­nė. MongoDB užklausas galite padaryti tik­s­les­nes naudodami pa­pil­do­mus pa­ra­met­rus. Toliau nu­ro­dy­si­me vertę iš segmento „units“ be įmonės pa­va­di­ni­mo „ATS“. Tokiu būdu mūsų užklausa ieškos dokumento, kuriame yra abi vertės:

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

Turime tikslią atitiktį. Jei tik viena iš dviejų verčių yra ati­tin­ka­ma, re­zul­ta­tas nebus rodomas. Štai pavyzdys užklausos be rezultatų:

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

Jei norite at­si­žvelg­ti į skir­tin­gas reikšmes naudodami MongoDB užklausas, bet norite, kad užklausa pateiktų rezultatą net ir tada, kai ten­ki­na­mas tik vienas iš rei­ka­la­vi­mų, įveskite šią komandą:

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

Verčių paieška masyvuose

MongoDB už­klau­so­se taip pat galite at­si­žvelg­ti į masyvų vertes. Mūsų ko­lek­ci­jo­je yra įmonių, kurios turi filialus keliose šalyse. Jei norite išvesti visas įmones, kurios turi bent vieną filialą Vo­kie­ti­jo­je, galite įvesti šią in­for­ma­ci­ją:

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

Dabar re­zul­ta­tuo­se yra visi trys klientai, turintys bent vieną filialą Vo­kie­ti­jo­je. Jei norite išplėsti įvestį ir rasti įmones, turinčias filialus Vo­kie­ti­jo­je ir Aust­ri­jo­je, naudodami tą patį užklausą, galite naudoti masyvą:

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

Pa­ste­bė­si­te, kad įvesties laukelyje rodomas tik vienas re­zul­ta­tas, nors teoriškai paieškos kri­te­ri­jus atitinka dvi įmonės. Taip yra todėl, kad MongoDB užklausos tiksliai atitinka įvesties laukelyje nurodytą in­for­ma­ci­ją, įskaitant elementų tvarką. Jei norite, kad metodas at­si­žvelg­tų į vertes ne­pri­klau­so­mai nuo jų tvarkos, užklausą rašykite taip:

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

Vertės užklausos įterp­tuo­se do­ku­men­tuo­se

Mūsų ko­lek­ci­jo­je taip pat yra įterpti do­ku­men­tai, kuriuos taip pat galima išvesti naudojant MongoDB užklausas. Norėdami tai padaryti, turite pridėti tašką, kad MongoDB žinotų, jog reikia ana­li­zuo­ti įterpto dokumento lauką. Pa­vyz­džiui, jei norite gauti visų klientų, kurie atliko daugiau nei dešimt sandorių, sąrašą, įveskite šią komandą:

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

MongoDB pasiekia dokumentą „tran­sac­tions“ ir tada ieško bendro sandorių skaičiaus skiltyje „total“.

Kaip apriboti MongoDB užklausų išvestį

MongoDB užklausų išvestis gali būti gana didelė, todėl gali būti tikslinga apriboti išvestį iki kelių laukų. Naudodami pro­jek­ci­jas galite apriboti išvestyje rodomų laukų skaičių. Jos turi reikšmę 1 (laukeliai, kurie turėtų būti įtraukti į išvestį) ir 0 (laukeliai, kurie neturėtų būti įtraukti į išvestį).

Šiame pavyzdyje atliksime dviejų dalių užklausą. Pir­miau­sia, naudodami find metodą, ini­ci­juo­si­me paiešką be parametrų. Ji pati išvestų visus ko­lek­ci­jos duomenis. Tačiau iš karto po to atliksime pro­jek­ci­ją, kurioje bus at­si­žvel­gia­ma tik į lauko „name“ reikšmę.

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

Bus rodomi visi klientai, tačiau išvestis bus apribota tik įmonių pa­va­di­ni­mais.

Kas yra žymekliai ir kaip juos naudoti MongoDB už­klau­so­se?

Kursoriai leidžia pri­tai­ky­ti Mongo DB užklausos rezultatų rodymą, ne­kei­čiant pačių užklausos rezultatų. Pa­vyz­džiui, galite apriboti rodomų rezultatų skaičių arba pakeisti jų tvarką. Jei norite rodyti tik du re­zul­ta­tus, galite naudoti ribojimo metodą. Tai daroma taip:

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

Norėdami su­rū­šiuo­ti re­zul­ta­tus, galite naudoti šį įrašą. Tai parodys tris klientus, kurie užsisakė ma­žiau­siai produktų:

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

Norėdami rasti konkretų dokumentą savo duomenų bazėje, galite naudoti MongoDB findONE metodą. Šį metodą išsamiau pa­aiš­ki­na­me kitame mūsų skait­me­ni­nio vadovo straips­ny­je.

9378b1ddb0084eac26edf8b51e922ecb

b713997fc6bfc4f1f8d7a9ec6d65df69

c9ac60f2f370c12c4028af59a2fea6ae

7dd4860127d59f767354576150e2acbd

03b2f431bad31c7bebd9b9a784e591ba

641becce284983e6cc3064159285947f

Go to Main Menu