MongoDB:n findOne-metodi on erin­omai­nen kokoelman hakua varten. Se palauttaa kuitenkin vain yhden tuloksen, minkä vuoksi se ei sovellu mo­nen­lai­siin hauksiin.

Mikä on MongoDB findOne?

MongoDB on tie­to­kan­nan hal­lin­ta­jär­jes­tel­mä, joka pystyy helposti tal­len­ta­maan ja hal­lin­noi­maan suuria tie­to­mää­riä NoSQL-lä­hes­ty­mis­ta­van ja huo­mat­ta­van skaa­lau­tu­vuu­den ansiosta. Nämä omi­nai­suu­det tarjoavat käyt­tä­jil­le mer­kit­tä­viä etuja, mutta ne myös tar­koit­ta­vat, että jär­jes­tel­mä tarvitsee te­hok­kai­ta me­ne­tel­miä var­mis­taak­seen, että käyttäjät voivat navigoida tie­to­kan­nas­sa te­hok­kaas­ti.

Jär­jes­tel­mä tallentaa kaiken tyyppiset tiedot BSON-do­ku­men­tin (binary JSON) muodossa ja niputtaa nämä do­ku­men­tit ko­koel­miin. Jos haluat etsiä ja tulostaa yhden näistä do­ku­men­teis­ta, sinulla on käy­tet­tä­vis­sä­si useita vaih­toeh­to­ja. Ylei­sem­män ha­ku­me­ne­tel­män MongoDB find lisäksi MongoDB findOne on erittäin tehokas menetelmä suurten tie­to­kan­to­jen tarkkaan suo­dat­ta­mi­seen.

MongoDB findOne etsii kaikki asia­kir­jat ja kokoelmat käyttäjän mää­rit­te­le­mien kri­tee­rien pe­rus­teel­la. Tämän me­ne­tel­män eri­tyis­piir­re on, että se palauttaa aina täs­mäl­leen yhden do­ku­men­tin. Jos ha­ku­ky­se­lys­sä on vain yksi do­ku­ment­ti, tämä do­ku­ment­ti pa­lau­te­taan. Jos useat do­ku­men­tit vastaavat käyttäjän mää­rit­tä­miä pa­ra­met­re­ja, MongoDB findOne palauttaa do­ku­men­tin, joka esiintyy en­sim­mäi­se­nä tie­to­kan­nan luon­nol­li­ses­sa jär­jes­tyk­ses­sä. Jos hakua varten ei löydy do­ku­ment­te­ja, tulos on ”null”.

Mikä on MongoDB findOne -komennon syntaksi?

MongoDB findOne -komennon pe­rus­ra­ken­teet ovat yk­sin­ker­tai­set. Me­ne­tel­mää käytetään seu­raa­vas­ti:

db.collection.findOne ( <query>, <projection>, <options> )
shell

Alle <query> voivat määrittää, miten menetelmä suodattaa asia­kir­jat.

Alle <projection> voit määrittää, mitkä kentät pa­lau­tet­ta­vas­sa asia­kir­jas­sa näytetään. Käytä boolen arvoja 1 (tosi/sisällytä) ja 0 (epätosi/sulje pois) osoit­ta­maan, pitäisikö kenttä si­säl­lyt­tää. Jos tämä parametri jää tyhjäksi, kaikki kentät näytetään.

Kolmas ha­ku­pa­ra­met­ri <options> mah­dol­lis­taa haun tar­ken­ta­mi­sen ja näytön muut­ta­mi­sen. Kaikki kolme ha­ku­pa­ra­met­ria ovat va­lin­nai­sia.

Kuinka luoda kokoelma testausta varten

Jos olet asentanut MongoDB:n Linux-, Windows- tai Mac-käyt­tö­jär­jes­tel­mään ja haluat käyttää MongoDB findOne -toimintoa, kannattaa luoda tes­tausym­pä­ris­tö, jossa voit kokeilla me­ne­tel­mää.

Jos et ole vielä mää­rit­tä­nyt tie­to­kan­taa, lue kattava MongoDB-oppaamme, jossa kerrotaan, miten tie­to­kan­ta mää­ri­te­tään. Alla olevassa esi­mer­kis­sä käytämme viisi merkintää si­säl­tä­vää työn­te­ki­jä­tie­to­kan­taa. Jokainen merkintä sisältää tietoja työn­te­ki­jän nimestä, su­ku­puo­les­ta ja iästä sekä siitä, kuinka kauan henkilö on ollut yrityksen pal­ve­luk­ses­sa. Kokoelma näyttää tältä:

# Create Collection
db.employee.insertMany ( [
    {
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
    },
    {
    name : "Jones",
    gender : "Female",
    age : 40,
    year : 2017,
    },
    {
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
    },
    {
    name : "Michaels",
    gender : "Female",
    age : 44,
    year : 2015
    },
    name : "Cartwright",
    gender : "Male",
    age : 22,
    year : 2022
    }
]
)
shell

Mitkä ovat eri tapoja hakea Mongo DB findOne -toi­min­nol­la?

MongoDB findOne -toi­min­nol­la voi etsiä tietoa useilla eri tavoilla. Voit tehdä haun ilman pa­ra­met­re­ja, ID:n avulla, yhden kentän avulla tai useiden kenttien avulla.

Haku ilman pa­ra­met­re­ja

Jos käytät MongoDB:n findOne-me­ne­tel­mää ilman pa­ra­met­re­ja, jär­jes­tel­mä etsii tie­to­kan­nas­ta­si kaikki merkinnät. Esi­mer­kis­säm­me tämä tar­koit­taa, että menetelmä tunnistaa viisi merkintää. Koska yhtään do­ku­ment­tia ei ole suljettu pois ja menetelmä palauttaa vain yhden tuloksen, MongoDB findOne valitsee en­sim­mäi­sen henkilön, joka on syötetty tie­to­kan­taan.

db.employee.findOne ( )
shell

Tulostus on:

db.employee.findOne ( )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Haku tunnuksen pe­rus­teel­la

Nor­maa­lis­ti haluat antaa jon­kin­lai­set ha­kuk­ri­tee­rit, jotta löydät juuri sen asia­kir­jan, jota tarvitset. Yksi tapa etsiä asia­kir­jo­ja MongoDB findOne -toi­min­nol­la on etsiä ID:tä.

Kenttä _id on ai­nut­laa­tui­nen jo­kai­ses­sa asia­kir­jas­sa. Esi­mer­kis­säm­me jokainen tunnus edustaa tar­kal­leen yhtä työn­te­ki­jää. Jos suoritat MongoDB findOne -komennon käyt­tä­mäl­lä ob­jek­ti­tun­nus­ta, saat tar­kal­leen haluamasi tuloksen.

db.employee.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
shell

Tulostus näyttää tältä:

db.employee.findOne ( { _id : ObjectID ( "582pfh773813tw982qj411l0" ) } )
{
    _id : ObjectID ( "582pfh773813tw982qj411l0"
    name : "Cartwright",
    gender : "Male",
    age : 22,
    year : 2022
}
shell

Haku tiettyjen kenttien avulla

Jos et tiedä tunnusta tai haluat etsiä ko­koel­mas­ta­si muita pa­ra­met­re­ja, voit myös käyttää MongoDB findOne -toimintoa tiettyjen kenttien et­si­mi­seen. Jos pa­ra­met­ria vastaava asiakirja on vain yksi, se näytetään. Jos ha­kueh­to­ja vastaavia asia­kir­jo­ja on useita, jär­jes­tel­mä näyttää vain en­sim­mäi­sen tuloksen.

Alla olevassa esi­mer­kis­sä haetaan kaikki merkinnät, joiden sukupuoli on ”Mies”. Komento on seuraava:

db.employee.findOne ( { gender : "Male" } )
shell

Tämän kriteerin mukaisia tuloksia on kaksi, mutta vain yksi niistä näytetään. Tuloksena näkyy työn­te­ki­jä Mr. Brown:

db.employee.findOne ( { gender : "Male" } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

Haku useilla kentillä

Voit myös rajata hakua edelleen, jotta vältät pääl­lek­käi­syy­det. Tämä ei ehkä ole tarpeen pienessä otok­ses­sam­me, mutta jos kä­sit­te­let useita satoja tai jopa tuhansia tietueita, tämä vaih­toeh­to on kätevä. MongoDB findOne -toi­min­nol­la voit käyttää useita kenttiä hakuun. Jos haluat tunnistaa työn­te­ki­jän su­ku­puo­len (mies) ja iän pe­rus­teel­la, voit kir­joit­taa seu­raa­vas­ti:

db.employee.findOne ( { gender : "Male", age: 40 } )
shell

Tu­lok­ses­sa näkyy jälleen kerran herra Brown, joka on ko­koel­mas­sa ainoa mies ja 40-vuotias. Neiti Jones on sa­ma­ni­käi­nen, mutta hänen su­ku­puo­len­sa ei vastaa kri­tee­re­jä, joten tulos näyttää tältä:

db.employee.findOne ( { gender : "Male", age: 40 } )
{
    _id : ObjectID ( "498p0t173mv489fh63th00kh"
    name : "Brown",
    gender : "Male",
    age : 40,
    year : 2019
}
shell

Kuinka asettaa ehtoja kentälle käyt­tä­mäl­lä MongoDB findOne -komentoa

On myös mah­dol­lis­ta mää­ri­tel­lä ehtoja tietylle kentälle ja käyttää niitä ha­kuk­ri­tee­rei­nä. Seu­raa­vas­sa esi­mer­kis­sä haetaan vain yli 30-vuotiaita työn­te­ki­jöi­tä.

Tämä merkintä näyttää tältä:

db.employee.findOne ( { age : { $gt : 30 } } )
shell

Tämä sulkee pois herra Cartw­righ­tin. Koska rouva Smith on yli 30-vuotias ja listan en­sim­mäi­nen henkilö, hän näkyy tuloksena:

db.employee.findOne ( { age : { $gt : 30 } } )
{
    _id : ObjectID ( "529ete7300of4002bme148om" ),
    name : "Smith",
    gender : "Female",
    age : 56,
    year : 2002
}
shell

Kuinka sulkea kentät pois MongoDB findOne -toi­min­nol­la

Jos sinulla on laajoja kokoelmia, jotka si­säl­tä­vät paljon tietoa, tuloste voi sisältää liikaa tietoa. Onneksi MongoDB findOne tarjoaa myös mah­dol­li­suu­den sulkea kenttiä pois tu­los­tees­ta. Seu­raa­vas­sa esi­mer­kis­sä emme halua näyttää ID:tä, su­ku­puol­ta ja ikää tu­los­tees­sa.

db.employee.findOne ( { name : "Smith" }, { _id : 0, gender : 0, age : 0 } )
shell

Saat seuraavan tuloksen:

db.employee.findOne ( { name : "Smith" }, { _id : 0, gender : 0, age : 0 } )
{
    name : "Smith",
    year : 2002
}
shell

Mitä tapahtuu, jos MongoDB findOne ei löydä hakuni tuloksia?

Jos MongoDB findOne -hakusi ei tuota tuloksia, tulos näytetään silti. Ha­vain­nol­lis­taak­sem­me mitä tapahtuu, haemme Ms. Larkhamia, joka ei ole ko­koel­mas­sa.

db.employee.findOne ( { name : "Larkham" }  )
shell

Tämän tulos on:

db.employee.findOne ( { name : "Larkham" }  )
null
shell
Vinkki

Ilmainen GUI MongoDB Compass helpottaa tie­to­kan­nan hallintaa. Lue graa­fi­ses­ta käyt­tö­liit­ty­mäs­tä lisää toisesta ar­tik­ke­lis­ta di­gi­taa­li­ses­sa op­paas­sam­me.

Siirry pää­va­lik­koon