MongoDB vaicājumi ļauj ātri un efektīvi meklēt un analizēt datu bāzi. Metodes struktūra ir loģiska, un to var izmantot kopā ar daudziem pa­ra­met­riem.

Kā efektīvi meklēt ko­lek­ci­jas

Kā dokumentu balstīts NoSQL ri­si­nā­jums, MongoDB lie­to­tā­jiem piedāvā iespēju viegli uzglabāt un pārvaldīt lielus un daudz­vei­dī­gus datu apjomus. Datubāzes pār­val­dī­bas sistēma ir ļoti elastīga un to var viegli ho­ri­zon­tā­li mērogot.

Atšķirībā no re­la­tī­va­jām datu bāzēm, dati Mongo DB tiek glabāti BSON do­ku­men­tos (binārais JSON) un apkopoti ko­lek­ci­jās. Lai šī pieeja patiešām darbotos, ir svarīgi, laibūtu spēcīgi vaicājumu mehānismi, kas var pārbaudīt datu bāzi un sniegt lie­to­tā­jiem ne­pie­cie­ša­mo in­for­mā­ci­ju. Ar MongoDB vai­cā­ju­miem datu bāze var meklēt pat sarežģīti struk­tu­rē­tas ko­lek­ci­jas, lai sniegtu jums ne­pie­cie­ša­mo in­for­mā­ci­ju.

Tip

Vai MongoDB apvalka iz­man­to­ša­na ir pārāk sarežģīta? MongoDB Compass ir bezmaksas grafiska lietotāja saskarne, kas atvieglo na­vi­gā­ci­ju MongoDB.

Kas ir MongoDB vaicājumi?

MongoDB vaicājumi ir lie­to­tā­jam draudzīgs rīks, ko izmanto sarežģītu datu struktūru mek­lē­ša­nai. Tie atbilst loģiskiem no­tei­ku­miem un darbojas kā fil­trē­ša­nas opcijas, kas atrodamas lielākajā daļā tīmekļa vietņu. Tas ļauj formulēt meklējumu pēc iespējas precīzāk, lai sasniegtu vis­la­bā­kos ie­spē­ja­mos re­zul­tā­tus. Tas ir īpaši svarīgi, jo MongoDB spēj uzglabāt daudzus dažādus datu veidus. Bez ne­pie­cie­ša­ma­jām fil­trē­ša­nas opcijām datu bāzes pār­val­dī­ba būtu sarežģīta. Turp­mā­ka­jās sadaļās mēs iz­skaid­ro­sim, kas ne­pie­cie­šams, lai izveidotu MongoDB vai­cā­ju­mus, un kā tos lietot.

Kādas ir prasības MongoDB vai­cā­ju­miem?

MongoDB vaicājumu iz­man­to­ša­nai ir tikai daži no­sa­cī­ju­mi.

  1. Jūsu datorā ir jābūt in­sta­lē­tai MongoDB. Datubāze darbojas daudzās ope­rē­tājsis­tē­mās, tādēļ zemāk minētās ins­truk­ci­jas darbojas ne­at­ka­rī­gi no tā, vai iz­man­to­jat Linux, OS X vai Windows. Pēc in­sta­lē­ša­nas veicamie soļi ir vienādi visās sistēmās un attiecas tikai uz pašu datubāzi. Par in­sta­lē­ša­nas procesu varat uzzināt mūsu MongoDB apmācībā.
  2. Lai izmantotu mek­lē­ša­nas funkciju, jums ir ne­pie­cie­ša­mas ad­mi­nis­tra­to­ra tiesības.
  3. Vislabāk ir izveidot testa vidi, lai varētu izmēģināt Mongo DB vai­cā­ju­mus bez riska.

Kā struk­tu­rēt testa kolekciju

Vispirms atveriet apvalku un pie­sa­kie­ties kā ad­mi­nis­tra­tors. Tad iz­vei­do­jiet jaunu kolekciju, kas kalpos kā testa vide jūsu pirmajiem MongoDB vai­cā­ju­miem. Papildus vienkāršu dokumentu mek­lē­ša­nai, metode var meklēt arī masīvus, dažādus laukus un iegultos do­ku­men­tus, tāpēc esam nolēmuši izveidot nedaudz sa­rež­ģī­tā­ku kolekciju. Tādējādi jūs labāk iz­pra­tī­siet MongoDB vaicājumu apjomu.

Mūsu piemērs sastāv no klientu saraksta. Šī saraksta formāts ir šāds:

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

Šis dokuments satur šādu in­for­mā­ci­ju:

  • nosaukums: Preces ie­gā­dā­ju­sies uzņēmuma nosaukums.
  • vienības: Kopējais uzņēmuma pasūtīto produktu skaits.
  • atrašanās vieta: Uzņēmuma atrašanās vieta. Ja ir vairākas filiāles, tās var saglabāt masīva veidā.
  • transak­ci­jas: Šajā laukā ir iekļauts papildu dokuments. Šādus do­ku­men­tus sauc par „ie­vie­to­tiem do­ku­men­tiem” vai „iegultiem do­ku­men­tiem”. Katrs no transak­ci­ju do­ku­men­tiem satur in­for­mā­ci­ju par to, cik ilgi uzņēmums ir bijis klients (sadaļā „pirmais”), kad tika veikts pēdējais pa­sū­tī­jums (sadaļā „pēdējais”) un kopējo reizes, kad uzņēmums ir pasūtījis produktus (sadaļā „kopā”).

Šajā piemērā mēs esam pie­vie­no­ju­ši papildu do­ku­men­tus, lai vēlāk būtu vieglāk iekļaut in­for­mā­ci­ju. Tas palīdz no­dro­ši­nāt labu pārskatu par in­for­mā­ci­ju datu bāzē.

Testa ko­lek­ci­jas izveide MongoDB vai­cā­ju­miem

Tagad mēs iz­vei­do­sim kolekciju ar nosaukumu „Klienti”. Lai būtu vieglāk pārskatīt kolekciju, mēs iekļausim tikai piecus ierakstus. Ja darbā iz­man­to­jat MongoDB vai­cā­ju­mus, varat izveidot plašākas ko­lek­ci­jas, iz­man­to­jot insertMany metodi.

Šeit ir redzams, kā izskatās mūsu testa kolekcija:

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

Kad iz­pil­dī­siet šo ierakstu ar mūsu iz­man­to­ta­jiem datiem (vai saviem datiem), saņemsiet objektu ID sarakstu. Tie ir unikāli un nodrošina, ka katru dokumentu var atrast arī pēc at­bil­sto­šā ID. Ja vēlaties pār­lie­ci­nā­ties, ka visi dokumenti ir iekļauti kolekcijā, varat izmantot MongoDB find bez pa­ra­met­riem:

db.customers.find ( )
shell

Rezultāts ir visu objektu ID saraksts ar pilnīgiem do­ku­men­tiem. Tagad tos varat meklēt, iz­man­to­jot MongoDB vai­cā­ju­mus.

Kā lietot MongoDB vai­cā­ju­mus ar laukiem un masīviem

Jūs varat izmantot MongoDB vai­cā­ju­mus, lai meklētu at­se­viš­ķus laukus, vairākus laukus, masīvus un iegultos do­ku­men­tus. Katru no tiem ap­ska­tī­sim turp­mā­ka­jās sadaļās.

Atsevišķu lauku vaicāšana ar MongoDB vai­cā­ju­miem

MongoDB find izvade parāda, cik noderīgi var būt MongoDB vaicājumi. Mūsu nelielais paraugs rada izvadi ar garām rakstzīm­ju virknēm, tādēļ varat ie­do­mā­ties, kā tas izskatās, ja strādājat ar lielāku paraugu.

Turp­mā­ka­jā piemērā mēs arī iz­man­to­sim find, bet šoreiz mēs iz­vei­do­sim īpašu prasību, kurai do­ku­men­tam ir jāatbilst, lai to varētu izvadīt. Konkrēti, mēs meklēsim visus do­ku­men­tus, kuru nosaukumā ir vārds „ATS”.

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

Vienkārši MongoDB vaicājumi, piemēram, šis, tagad meklēs visus do­ku­men­tus kolekcijā un atradīs tos, kuru nosaukuma vērtība ir “ATS”. Tas attiecas tikai uz vienu ierakstu mūsu kolekcijā, tāpēc rezultāts izskatās šādi:

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

To var darīt arī otrādi. Ja vēlaties parādīt visus re­zul­tā­tus, izņemot ierakstu „ATS”, ievadiet šādu komandu:

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

Ja vēlaties izvadīt MongoDB vai­cā­ju­mus ar dažādām vērtībām, to var izdarīt, iz­man­to­jot masīvu. To izdarīsim, iz­man­to­jot klientus ATS un Jorgensen.

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

Vairāku lauku vaicāšana ar MongoDB vai­cā­ju­miem

Ja jums ir ne­pie­cie­ša­mi precīzi rezultāti, ir svarīgi padarīt savu vaicājumu kon­krē­tā­ku. Jūs varat padarīt savus MongoDB vai­cā­ju­mus pre­cī­zā­kus, iz­man­to­jot papildu pa­ra­met­rus. Zemāk mēs norādīsim vērtību no segmenta „units” papildus uzņēmuma no­sau­ku­mam „ATS”. Tādējādi mūsu vaicājums meklēs dokumentu, kas satur abas vērtības:

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

Mums ir precīza atbilde. Ja tikai viena no divām vērtībām atbilst, rezultāts netiks parādīts. Šeit ir piemērs ar vaicājumu, kam nav rezultātu:

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

Ja vēlaties ņemt vērā dažādas vērtības, iz­man­to­jot MongoDB vai­cā­ju­mus, bet vēlaties, lai vaicājums izvadītu rezultātu pat tad, ja ir izpildīta tikai viena no prasībām, ievadiet šo:

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

Vērtību pie­pra­sī­ša­na masīvos

Ar MongoDB vai­cā­ju­miem var ņemt vērā arī masīvu vērtības. Mūsu kolekcijā ir uzņēmumi, kuriem ir filiāles vairākās valstīs. Ja vēlaties izvadīt visus uzņēmumus, kuriem ir vismaz viena filiāle Vācijā, varat ievadīt šādu vaicājumu:

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

Rezultātā tagad ir iekļauti visi trīs klienti, kuriem ir vismaz viena filiāle Vācijā. Ja vēlaties pa­pla­ši­nāt savu ievadi un atrast uzņēmumus, kuriem ir filiāles Vācijā un Austrijā, iz­man­to­jot to pašu vaicājumu, varat izmantot masīvu:

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

Jūs ie­vē­ro­siet, ka ievade parāda tikai vienu rezultātu, kaut arī teo­rē­tis­ki divas kom­pā­ni­jas atbilst mek­lē­ša­nas kri­tē­ri­jiem. Iemesls tam ir tas, ka MongoDB vaicājumi precīzi atbilst ie­va­dī­ta­jam, ieskaitot elementu secību. Ja vēlaties, lai metode ņemtu vērā vērtības ne­at­ka­rī­gi no to pa­rā­dī­ša­nās secības, rakstiet vaicājumu šādi:

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

Vērtību pie­pra­sī­ša­na iegultos do­ku­men­tos

Mūsu kolekcijā ir arī iegultie dokumenti, kurus var izvadīt, iz­man­to­jot MongoDB vai­cā­ju­mus. Lai to izdarītu, jums ir jā­pie­vie­no punkts, lai norādītu MongoDB, ka ir jāanalizē iegultā dokumenta lauks. Piemēram, ja vēlaties sarakstu ar visiem klientiem, kuriem ir vairāk nekā desmit darījumu, ievadiet šādu komandu:

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

MongoDB piekļūst do­ku­men­tam „transac­tions” un pēc tam meklē kopējo darījumu skaitu sadaļā „total”.

Kā ierobežot MongoDB vaicājumu izvadi

MongoDB vaicājumu rezultāti var būt diezgan apjomīgi, tāpēc var būt liet­de­rī­gi ierobežot re­zul­tā­tus tikai dažiem laukiem. Lai ie­ro­be­žo­tu re­zul­tā­tos parādāmo lauku skaitu, var izmantot pro­jek­ci­jas. Tās satur vērtību 1 (lauki, kas jāiekļauj re­zul­tā­tos) un 0 (lauki, kas nav jāiekļauj re­zul­tā­tos).

Šajā piemērā mēs veiksime divdaļīgu vaicājumu. Pirmkārt, mēs uzsāksim meklēšanu bez pa­ra­met­riem, iz­man­to­jot metodi find. Pati par sevi tā izvadīs visus datus kolekcijā. Tomēr mēs uzreiz pēc tam iz­man­to­sim pro­jek­ci­ju, kas ņem vērā tikai lauku name.

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

Tiks parādīti visi klienti, bet izvade tiks ie­ro­be­žo­ta ar uzņēmumu no­sau­ku­miem.

Kas ir kursori un kā tos var izmantot MongoDB vai­cā­ju­mos?

Kursori piedāvā iespēju pielāgot Mongo DB vaicājumu rezultātu at­tē­lo­ša­nu, nemainot pašu vaicājumu re­zul­tā­tus. Piemēram, varat ierobežot attēloto rezultātu skaitu vai mainīt to secību. Ja vēlaties attēlot tikai divus re­zul­tā­tus, varat izmantot ie­ro­be­žo­ša­nas metodi. To var izdarīt šādi:

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

Lai šķirotu re­zul­tā­tus, varat izmantot šādu ierakstu. Tādējādi tiks parādīti trīs klienti, kuri ir pa­sū­tī­ju­ši vismazāk produktu:

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

Lai atrastu konkrētu dokumentu savā datu bāzē, varat izmantot MongoDB findONE metodi. Šo metodi sīkāk iz­skaid­ro­jam citā rakstā mūsu di­gi­tā­la­jā ceļvedī.

9378b1ddb0084eac26edf8b51e922ecb

b713997fc6bfc4f1f8d7a9ec6d65df69

c9ac60f2f370c12c4028af59a2fea6ae

7dd4860127d59f767354576150e2acbd

03b2f431bad31c7bebd9b9a784e591ba

641becce284983e6cc3064159285947f

af5bd231f8dfa4f75eecbb9d98b6d7d7

Go to Main Menu