MongoDB-kyselyjen avulla voit etsiä ja ana­ly­soi­da tie­to­kan­taa­si nopeasti ja te­hok­kaas­ti. Me­ne­tel­män rakenne on looginen, ja sen kanssa voi käyttää lukuisia pa­ra­met­re­ja.

Kuinka etsiä ko­koel­mis­ta te­hok­kaas­ti

Do­ku­ment­ti­poh­jai­se­na NoSQL-rat­kai­su­na MongoDB tarjoaa käyt­tä­jil­le mah­dol­li­suu­den tallentaa ja hallita helposti suuria ja mo­ni­puo­li­sia tie­to­mää­riä. Tie­to­kan­nan hal­lin­ta­jär­jes­tel­mä on erittäin joustava ja helposti vaa­ka­suo­raan skaa­lat­ta­vis­sa.

Toisin kuin re­laa­tio­tie­to­kan­nois­sa, Mongo DB:n tiedot tal­len­ne­taan BSON-do­ku­men­teis­sa (binary JSON) ja kootaan ko­koel­miin. Jotta tämä lä­hes­ty­mis­ta­pa todella toimisi, on tärkeää, ettäkäytössä on tehokkaat ky­se­ly­me­ka­nis­mit, jotka voivat seuloa tie­to­kan­nan ja esittää käyt­tä­jil­le tar­vit­ta­vat tiedot. MongoDB-ky­se­lyil­lä tie­to­kan­ta voi jopa etsiä mo­ni­mut­kai­ses­ti ra­ken­ne­tuis­ta ko­koel­mis­ta etsimäsi tiedot.

Vinkki

Onko MongoDB:n ko­men­to­ke­hot­teen käyttö liian mo­ni­mut­kais­ta? MongoDB Compass on ilmainen graafinen käyt­tö­liit­ty­mä, joka helpottaa MongoDB:n käyttöä.

Mitä ovat MongoDB-kyselyt?

MongoDB-kyselyt ovat käyt­tä­jäys­tä­väl­li­nen työkalu mo­ni­mut­kais­ten tie­to­ra­ken­tei­den hakua varten. Ne nou­dat­ta­vat loogisia sääntöjä ja toimivat kuten useim­mil­la verk­ko­si­vus­toil­la olevat suo­da­tin­vaih­toeh­dot. Näin voit muotoilla haun mah­dol­li­sim­man tarkasti ja saada parhaat mah­dol­li­set tulokset. Tämä on erityisen tärkeää, koska MongoDB pystyy tal­len­ta­maan mo­nen­lai­sia tietoja. Ilman tar­vit­ta­via suo­da­tin­vaih­toeh­to­ja tie­to­kan­nan hallinta olisi vaikeaa. Seu­raa­vis­sa osioissa selitämme, mitä tarvitset MongoDB-kyselyjen luomiseen ja miten niitä käytetään.

Mitkä ovat MongoDB-kyselyjen vaa­ti­muk­set?

MongoDB-kyselyjen käyttöön liittyy vain muutamia vaa­ti­muk­sia.

  1. Tie­to­ko­neel­la­si on oltava asen­net­tu­na MongoDB. Tie­to­kan­ta toimii useilla käyt­tö­jär­jes­tel­mil­lä, joten alla olevat ohjeet toimivat riip­pu­mat­ta siitä, käytätkö Linuxia, OS X:ää tai Windowsia. Asen­nuk­sen jälkeiset vaiheet ovat samat kaikilla jär­jes­tel­mil­lä ja koskevat vain itse tie­to­kan­taa. Asen­nuk­sen kulku selviää MongoDB-op­paas­tam­me.
  2. Tarvitset jär­jes­tel­män­val­vo­jan oikeudet, jotta voit käyttää ha­ku­toi­min­toa.
  3. On suo­si­tel­ta­vaa luoda tes­tausym­pä­ris­tö, jotta voit kokeilla Mongo DB -kyselyjä riskittä.

Tes­ti­ko­koel­man ra­ken­ta­mi­nen

Avaa ensin ko­men­to­tulk­ki ja kirjaudu sisään jär­jes­tel­män­val­vo­ja­na. Luo sitten uusi kokoelma, joka toimii tes­tausym­pä­ris­tö­nä en­sim­mäi­sil­le MongoDB-ky­se­lyil­le­si. Yk­sin­ker­tais­ten asia­kir­jo­jen hakujen lisäksi me­ne­tel­mäl­lä voidaan hakea myös tau­lu­koi­ta, erilaisia kenttiä ja upo­tet­tu­ja asia­kir­jo­ja, minkä vuoksi olemme päät­tä­neet luoda hieman mo­ni­mut­kai­sem­man kokoelman. Näin saat paremman kä­si­tyk­sen MongoDB-kyselyjen laa­juu­des­ta.

Esi­mer­kis­säm­me on luettelo asiak­kais­ta. Luettelon muoto on seuraava:

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

Tämä asiakirja sisältää seuraavat tiedot:

  • nimi: Tavarat ostaneen yrityksen nimi.
  • yksiköt: Yrityksen tilaamien tuot­tei­den ko­ko­nais­mää­rä.
  • sijainti: Yrityksen sijainti. Jos yri­tyk­sel­lä on useita toi­mi­pis­tei­tä, ne voidaan tallentaa tau­luk­ko­muo­dos­sa.
  • tran­sak­tiot: Tämä kenttä sisältää li­sä­asia­kir­jan. Tällaisia asia­kir­jo­ja kutsutaan ”upo­te­tuik­si asia­kir­joik­si” tai ”si­säk­käi­sik­si asia­kir­joik­si”. Jokainen tran­sak­tio­asia­kir­ja sisältää tietoja siitä, kuinka kauan yritys on ollut asiakas (kohdassa ”en­sim­mäi­nen”), milloin viimeinen tilaus tehtiin (kohdassa ”viimeinen”) ja kuinka monta kertaa yritys on tilannut tuotteita (kohdassa ”yhteensä”).

Tässä esi­mer­kis­sä olemme lisänneet li­sä­asia­kir­jo­ja, jotta tietojen li­sää­mi­nen myöhemmin on helpompaa. Näin var­mis­te­taan hyvä yleiskuva tie­to­kan­nan tiedoista.

Tes­ti­ko­koel­man luominen MongoDB-ky­se­lyil­le

Nyt luomme kokoelman nimeltä “Asiakkaat”. Jotta ko­koel­mas­ta on helppo saada yleiskuva, si­säl­ly­täm­me siihen vain viisi merkintää. Jos käytät MongoDB-kyselyitä työssäsi, voit luoda laajempia kokoelmia insertMany.

Tässä on tes­ti­ko­koel­mam­me:

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

Kun suoritat tämän merkinnän käyt­tä­mil­läm­me tiedoilla (tai omilla tie­doil­la­si), saat vas­tauk­sek­si luettelon objektien tun­nis­teis­ta. Nämä tun­nis­teet ovat yk­si­löl­li­siä ja var­mis­ta­vat, että jokainen asiakirja voidaan löytää myös vastaavan tun­nis­teen avulla. Jos haluat varmistaa, että kaikki asia­kir­jat on si­säl­ly­tet­ty ko­koel­maan, voit käyttää MongoDB-hakua ilman pa­ra­met­re­ja:

db.customers.find ( )
shell

Tuloksena on luettelo kaikista ob­jek­ti­tun­nuk­sis­ta ja täy­del­li­sis­tä asia­kir­jois­ta. Voit nyt etsiä niitä MongoDB-ky­se­lyil­lä.

MongoDB-kyselyjen käyttö kenttien ja tau­lu­koi­den kanssa

MongoDB-ky­se­lyil­lä voi hakea yk­sit­täi­siä kenttiä, useita kenttiä, tau­lu­koi­ta ja upo­tet­tu­ja asia­kir­jo­ja. Kat­so­taan­pa näitä kaikkia tarkemmin alla olevissa osioissa.

Yk­sit­täis­ten kenttien kysely MongoDB-ky­se­lyil­lä

MongoDB find n tuloste osoittaa, kuinka hyö­dyl­li­siä MongoDB-kyselyt voivat olla. Pieni otoksemme tuottaa tulosteen, jossa on pitkiä merk­ki­jo­no­ja, joten voit kuvitella, millaista on työs­ken­nel­lä suuremman otoksen kanssa.

Seu­raa­vas­sa esi­mer­kis­sä käytämme myös lukua find, mutta tällä kertaa luomme erityisen vaa­ti­muk­sen, jonka asia­kir­jan on täy­tet­tä­vä, jotta se voidaan tulostaa. Tarkemmin sanottuna etsimme kaikki asia­kir­jat, joiden nimessä esiintyy sana “ATS”.

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

Tällaiset yk­sin­ker­tai­set MongoDB-kyselyt etsivät nyt kaikki kokoelman do­ku­men­tit ja löytävät ne, joiden nimi on “ATS”. Tämä koskee vain yhtä kokoelman merkintää, joten tulos näyttää tältä:

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

Toi­sin­päin toi­mi­mi­nen myös toimii. Jos haluat näyttää kaikki tulokset paitsi merkinnän “ATS”, kirjoita seuraava:

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

Jos haluat tuottaa MongoDB-kyselyitä eri arvoilla, voit tehdä sen taulukon avulla. Teemme tämän käyt­tä­mäl­lä asiak­kai­ta ATS ja Jorgensen.

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

Useiden kenttien kysely MongoDB-ky­se­lyil­lä

Jos tarvitset tarkkoja tuloksia, on tärkeää tarkentaa hakua. Voit tarkentaa MongoDB-hakua käyt­tä­mäl­lä li­sä­pa­ra­met­re­ja. Alla mää­ri­täm­me arvon seg­men­tis­tä “units” yrityksen nimen “ATS” lisäksi. Tällä tavalla haku etsii do­ku­men­tin, joka sisältää molemmat arvot:

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

Meillä on tarkka vas­taa­vuus. Jos vain toinen arvoista on vastaava, tulosta ei näytetä. Tässä on esimerkki kyselystä, jossa ei ole tuloksia:

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

Jos haluat ottaa huomioon erilaisia arvoja MongoDB-ky­se­lyis­sä, mutta haluat, että kysely tuottaa tuloksen, vaikka vain yksi vaa­ti­muk­sis­ta täyttyy, kirjoita seuraava:

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

Arvojen kysely tau­lu­kois­ta

MongoDB-ky­se­lyis­sä voidaan ottaa huomioon myös tau­lu­koi­den arvot. Ko­koel­mas­sam­me on yrityksiä, joilla on si­vu­liik­kei­tä useissa maissa. Jos haluat tulostaa kaikki yritykset, joilla on vähintään yksi sivuliike Saksassa, voit syöttää seuraavan:

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

Tu­lok­ses­sa on nyt kaikki kolme asiakasta, joilla on vähintään yksi sivuliike Saksassa. Jos haluat laajentaa hakua ja löytää yrityksiä, joilla on si­vu­liik­kei­tä Saksassa ja Itä­val­las­sa, voit käyttää samaa ha­ku­lause­ket­ta ja taulukkoa:

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

Huomaat, että tuloksena näkyy vain yksi tulos, vaikka teoriassa kaksi yritystä täyttää ha­kuk­ri­tee­rit. Syynä tähän on se, että MongoDB-kyselyt nou­dat­ta­vat tarkasti annettua syötettä, mukaan lukien ele­ment­tien järjestys. Jos haluat, että menetelmä ottaa arvot huomioon niiden jär­jes­tyk­ses­tä riip­pu­mat­ta, kirjoita kysely seu­raa­vas­ti:

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

Arvojen kysely upo­te­tuis­sa asia­kir­jois­sa

Ko­koel­mas­sam­me on myös upo­tet­tu­ja asia­kir­jo­ja, jotka voidaan tulostaa myös MongoDB-ky­se­lyil­lä. Tätä varten sinun on lisättävä piste, joka ilmoittaa MongoDB:lle, että upotetun asia­kir­jan kenttä on ana­ly­soi­ta­va. Jos haluat esi­mer­kik­si luettelon kaikista asiak­kais­ta, joilla on yli kymmenen ta­pah­tu­maa, kirjoita seuraava:

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

MongoDB hakee “tran­sac­tions”-asia­kir­jan ja etsii sitten “total”-kohdasta tran­sak­tioi­den ko­ko­nais­mää­rän.

MongoDB-kyselyjen tu­los­tuk­sen ra­joit­ta­mi­nen

MongoDB-kyselyjen tulokset voivat olla varsin laajoja, minkä vuoksi voi olla järkevää rajoittaa tuloksia vain muutamaan kenttään. Voit käyttää pro­jek­tio­ta ra­joit­taak­se­si tu­lok­sis­sa näkyvien kenttien määrää. Nämä si­säl­tä­vät arvon 1 (kentät, jotka tulisi si­säl­lyt­tää tuloksiin) ja 0 (kentät, joita ei tulisi si­säl­lyt­tää tuloksiin).

Seu­raa­vas­sa esi­mer­kis­sä suo­ri­tam­me kak­sio­sai­sen kyselyn. Ensin aloitamme haun ilman pa­ra­met­re­ja käyt­tä­mäl­lä find. Yksinään se tu­los­tai­si kaikki kokoelman tiedot. Kuitenkin jatkamme heti sen jälkeen pro­jek­tioil­la, jotka ottavat huomioon vain nimi-kentän.

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

Kaikki asiakkaat näytetään, mutta tuloste rajoittuu yritysten nimiin.

Mitä kursorit ovat ja miten voin käyttää niitä MongoDB-ky­se­lyis­sä?

Kursorit tarjoavat tavan mukauttaa Mongo DB -kyselyn tulosten näyt­tö­ta­paa muut­ta­mat­ta kyselyn to­del­li­sia tuloksia. Voit esi­mer­kik­si rajoittaa näy­tet­tä­vien tulosten määrää tai muuttaa niiden jär­jes­tys­tä. Jos haluat näyttää vain kaksi tulosta, voit käyttää limit-me­ne­tel­mää. Näin se tehdään:

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

Voit lajitella tuloksen seu­raa­val­la mer­kin­näl­lä. Tämä näyttää kolme asiakasta, jotka ovat tilanneet vähiten tuotteita:

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

Voit etsiä tietyn asia­kir­jan tie­to­kan­nas­ta­si MongoDB:n findONE-me­ne­tel­mäl­lä. Selitämme tämän me­ne­tel­män tarkemmin toisessa ar­tik­ke­lis­sa di­gi­taa­li­ses­sa op­paas­sam­me.

Siirry pää­va­lik­koon