Z MongoDB po­i­zved­ba­mi lahko hitro in učin­ko­vi­to iščete in ana­li­zi­ra­te svojo bazo podatkov. Struktura metode je logična, pri čemer lahko uporabite številne parametre.

Kako učin­ko­vi­to iskati zbirke

Kot do­ku­men­tna rešitev NoSQL, MongoDB upo­rab­ni­kom omogoča enostavno shra­nje­va­nje in upra­vlja­nje velikih in ra­zno­li­kih količin podatkov. Sistem za upra­vlja­nje po­dat­kov­nih baz je zelo pri­la­go­dljiv in se lahko enostavno ho­ri­zon­tal­no širi.

Za razliko od re­la­cij­skih baz podatkov so podatki v Mongo DB shranjeni v do­ku­men­tih BSON (binarni JSON) in združeni v zbirkah. Da bi ta pristop resnično deloval, je pomembnoimeti močne mehanizme za po­i­zve­do­va­nje, ki lahko prečesajo bazo podatkov in prikažejo in­for­ma­ci­je, ki jih upo­rab­ni­ki po­tre­bu­je­jo. S po­i­zved­ba­mi MongoDB lahko baza podatkov išče celo v kom­ple­ksno struk­tu­ri­ra­nih zbirkah, da prikaže in­for­ma­ci­je, ki jih iščete.

Tip

Je uporaba lupine za MongoDB preveč zapletena? MongoDB Compass je brez­pla­čen grafični upo­rab­ni­ški vmesnik, ki olajša na­vi­ga­ci­jo po MongoDB.

Kaj so poizvedbe MongoDB?

Poizvedbe MongoDB so upo­rab­ni­ku prijazno orodje za iskanje kom­ple­ksnih po­dat­kov­nih struktur. Sledijo logičnim pravilom in delujejo podobno kot možnosti fil­tri­ra­nja, ki jih najdete na večini spletnih strani. To vam omogoča, da svoje iskanje obli­ku­je­te čim na­tanč­ne­je, da dosežete najboljše možne rezultate. To je še posebej pomembno, saj MongoDB lahko shranjuje veliko različnih vrst podatkov. Brez potrebnih možnosti fil­tri­ra­nja bi bilo upra­vlja­nje zbirke podatkov težko. V na­sle­dnjih poglavjih bomo pojasnili, kaj po­tre­bu­je­te za ustvar­ja­nje poizvedb MongoDB in kako jih upo­ra­blja­ti.

Kakšne so zahteve za poizvedbe v MongoDB?

Za uporabo poizvedb MongoDB je potrebnih le nekaj pogojev.

  1. Na ra­ču­nal­ni­ku morate imeti nameščen MongoDB. Baza podatkov deluje na številnih ope­ra­cij­skih sistemih, zato spodnja navodila veljajo ne glede na to, ali upo­ra­blja­te Linux, OS X ali Windows. Koraki, ki sledijo na­me­sti­tvi, so enaki na vseh sistemih in vplivajo samo na samo bazo podatkov. Kako poteka na­me­sti­tev, lahko izveste v našem MongoDB tutorialu.
  2. Za uporabo funkcije iskanja po­tre­bu­je­te ad­mi­ni­stra­tor­ske pravice.
  3. Najbolje je ustvariti testno okolje, da lahko brez tveganja pre­iz­ku­si­te poizvedbe Mongo DB.

Kako struk­tu­ri­ra­ti zbirko testov

Najprej odprite lupino in se prijavite kot skrbnik. Nato ustvarite novo zbirko, ki bo služila kot testno okolje za vaše prve poizvedbe MongoDB. Poleg iskanja pre­pro­stih do­ku­men­tov lahko ta metoda išče tudi nize, različna polja in vgrajene dokumente, zato smo se odločili ustvariti nekoliko bolj zapleteno zbirko. Na ta način boste dobili boljšo predstavo o obsegu poizvedb MongoDB.

Naš primer obsega seznam strank. Oblika tega seznama je naslednja:

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

Ta dokument vsebuje naslednje in­for­ma­ci­je:

  • ime: Ime podjetja, ki je kupilo blago.
  • enote: Skupno število izdelkov, ki jih je naročilo podjetje.
  • lokacija: Lokacija podjetja. Če ima podjetje več podružnic, se te lahko shranijo v obliki matrike.
  • tran­sak­ci­je: To polje vsebuje dodatni dokument. Takšni dokumenti se imenujejo »vgrajeni dokumenti« ali »vgrajeni dokumenti«. Vsak od tran­sak­cij­skih do­ku­men­tov vsebuje in­for­ma­ci­je o tem, kako dolgo je podjetje že stranka (pod postavko »prvo«), kdaj je bilo oddano zadnje naročilo (pod postavko »zadnje«) in skupno število naročil izdelkov s strani podjetja (pod postavko »skupaj«).

V tem primeru smo dodali dodatne dokumente, da bi bilo lažje vključiti in­for­ma­ci­je pozneje. S tem za­go­to­vi­mo dober pregled nad in­for­ma­ci­ja­mi v bazi podatkov.

Ustvar­ja­nje testne zbirke za poizvedbe MongoDB

Sedaj bomo ustvarili zbirko z imenom »Stranke«. Da bo pregled nad zbirko lažji, bomo vključili samo pet vnosov. Če za delo upo­ra­blja­te poizvedbe MongoDB, lahko ustvarite ob­se­žnej­še zbirke z metodo insertMany.

Tako izgleda naša testna zbirka:

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

Ko izvedete ta vnos z upo­ra­blje­ni­mi podatki (ali z lastnimi podatki), boste v zameno prejeli seznam ID-jev objektov. Ti so edin­stve­ni in za­go­ta­vlja­jo, da je vsak dokument mogoče najti tudi prek ustre­zne­ga ID-ja. Če želite preveriti, ali so vsi dokumenti vključeni v zbirko, lahko uporabite MongoDB find brez pa­ra­me­trov:

db.customers.find ( )
shell

Rezultat je seznam vseh ID-jev objektov s popolnimi dokumenti. Zdaj jih lahko iščete z uporabo poizvedb MongoDB.

Kako upo­ra­blja­ti poizvedbe MongoDB s polji in nizi

Z MongoDB po­i­zved­ba­mi lahko iščete posamezna polja, več polj, nize in vgrajene dokumente. V na­da­lje­va­nju bomo po­drob­ne­je obrav­na­va­li vsako od teh možnosti.

Po­i­zve­do­va­nje po­sa­me­znih polj z MongoDB po­i­zved­ba­mi

Izpis iz MongoDB find kaže, kako koristna so lahko poizvedbe MongoDB. Naš majhen vzorec ustvari izpis z dolgimi nizi znakov, zato si lahko pred­sta­vlja­te, kako je, če delate z večjim vzorcem.

V na­sle­dnjem primeru bomo prav tako uporabili find, vendar bomo tokrat ustvarili posebno zahtevo, ki jo mora dokument iz­pol­nje­va­ti, da se lahko izpiše. Na­tanč­ne­je, iskali bomo vse dokumente, ki imajo ime „ATS“.

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

Preprosta poizvedba MongoDB, kot je ta, bo zdaj preiskala vse dokumente v zbirki in našla tiste, ki imajo ime z vre­dno­stjo „ATS“. To velja samo za en vnos v naši zbirki, zato je izpis takšen:

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

Tudi obratno deluje. Če želite prikazati vse rezultate razen vnosa za »ATS«, vnesite naslednje:

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

Če želite izpisati poizvedbe MongoDB z raz­lič­ni­mi vre­dnost­mi, lahko to storite z uporabo matrike. To bomo storili z uporabo strank ATS in Jorgensen.

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

Po­i­zve­do­va­nje več polj z MongoDB po­i­zved­ba­mi

Če po­tre­bu­je­te natančne rezultate, je pomembno, da poizvedbo naredite bolj spe­ci­fič­no. Poizvedbe v MongoDB lahko naredite na­tanč­nej­še z uporabo dodatnih pa­ra­me­trov. Spodaj bomo poleg imena podjetja „ATS“ določili tudi vrednost iz segmenta „enote“. Na ta način bo naša poizvedba iskala dokument, ki vsebuje obe vrednosti:

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

Imamo natančno ujemanje. Če se ujemata samo ena od dveh vrednosti, rezultat ne bo prikazan. Tukaj je primer poizvedbe brez re­zul­ta­tov:

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

Če želite pri uporabi poizvedb MongoDB upo­šte­va­ti različne vrednosti, vendar želite, da poizvedba izpiše rezultat, tudi če je iz­pol­nje­na samo ena od zahtev, vnesite naslednje:

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

Po­i­zve­do­va­nje vrednosti v nizih

V po­i­zved­bah MongoDB lahko upo­šte­va­te tudi vrednosti v nizih. V naši zbirki so podjetja, ki imajo po­dru­žni­ce v več državah. Če želite izpisati vsa podjetja, ki imajo vsaj eno po­dru­žni­co v Nemčiji, lahko vnesete naslednje:

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

Izpis zdaj vsebuje vse tri stranke, ki imajo vsaj eno po­dru­žni­co v Nemčiji. Če želite razširiti svoj vnos in najti podjetja, ki imajo po­dru­žni­ce v Nemčiji in Avstriji, lahko uporabite isto poizvedbo in uporabite niz:

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

Opazili boste, da vnos prikaže le en rezultat, čeprav te­o­re­tič­no iskalnim merilom ustrezata dve podjetji. Razlog za to je, da poizvedbe MongoDB natančno upo­šte­va­jo vnesene podatke, vključno z vrstnim redom elementov. Če želite, da metoda upošteva vrednosti ne glede na vrstni red, v katerem se po­ja­vlja­jo, poizvedbo napišite na naslednji način:

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

Po­i­zve­do­va­nje vrednosti v vgrajenih do­ku­men­tih

V naši zbirki imamo tudi vgrajene dokumente, ki jih je mogoče izpisati tudi z uporabo poizvedb MongoDB. Za to morate dodati piko, da MongoDB si­gna­li­zi­ra­te, da je treba ana­li­zi­ra­ti polje v vgrajenem dokumentu. Če na primer želite seznam vseh strank, ki imajo več kot deset tran­sak­cij, vnesite naslednje:

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

MongoDB dostopa do dokumenta „tran­sak­ci­je“ in nato poišče število vseh tran­sak­cij pod „skupaj“.

Kako omejiti izhod poizvedb MongoDB

Izhodi poizvedb MongoDB so lahko precej obsežni, zato je smiselno, da izhod omejite na le nekaj polj. Za omejitev števila polj, pri­ka­za­nih v izhodu, lahko uporabite pro­jek­ci­je. Te vsebujejo vrednost 1 (polja, ki morajo biti vključena v izhod) in 0 (polja, ki ne smejo biti vključena v izhod).

V na­sle­dnjem primeru bomo izvedli dvodelno poizvedbo. Najprej bomo začeli iskanje brez pa­ra­me­trov z metodo find. Samo po sebi bi to izpisalo vse podatke v zbirki. Vendar bomo takoj zatem izvedli pro­jek­ci­jo, ki upošteva samo polje ime.

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

Prikazani bodo vsi kupci, vendar bo izpis omejen na imena podjetij.

Kaj so kazalci in kako jih lahko upo­ra­bljam v po­i­zved­bah MongoDB?

Kurzorji omogočajo pri­la­ga­ja­nje prikaza re­zul­ta­tov poizvedbe Mongo DB, ne da bi spre­me­ni­li dejanske rezultate poizvedbe. Na primer, lahko omejite število pri­ka­za­nih re­zul­ta­tov ali spre­me­ni­te njihov vrstni red. Če želite prikazati le dva rezultata, lahko uporabite metodo limit. Tako to storite:

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

Za raz­vr­šča­nje izhodnih podatkov lahko uporabite naslednji vnos. Prikazali se bodo trije kupci, ki so naročili najmanj izdelkov:

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

Če želite v svoji zbirki podatkov poiskati določen dokument, lahko uporabite metodo MongoDB findONE. To metodo po­drob­ne­je po­ja­snju­je­mo v drugem članku v našem di­gi­tal­nem vodniku.

9378b1ddb0084eac26edf8b51e922ecb

b713997fc6bfc4f1f8d7a9ec6d65df69

c9ac60f2f370c12c4028af59a2fea6ae

7dd4860127d59f767354576150e2acbd

03b2f431bad31c7bebd9b9a784e591ba

641becce284983e6cc3064159285947f

26d82365945b0a5f7ffdff0728634590

790acfdc7a291dc8e88a484b74b322e9

Go to Main Menu