A MongoDB findOne metódus kiválóan alkalmas gyűjtemények keresésére. Azonban csak egyetlen eredményt ad vissza, ezért sokféle kereséshez nem alkalmas.

Mi az a MongoDB findOne?

A MongoDB egy adatbázis-kezelő rendszer, amely NoSQL megközelítésének és figyelemre méltó skálázhatóságának köszönhetően nagy mennyiségű adatot képes könnyedén tárolni és kezelni. Míg ezek a tulajdonságok jelentős előnyöket kínálnak a felhasználóknak, egyúttal azt is jelentik, hogy a rendszernek hatékony módszerekre van szüksége ahhoz, hogy a felhasználók hatékonyan tudjanak navigálni az adatbázisban.

A rendszer minden típusú adatot BSON dokumentum (bináris JSON) formájában ment, és ezeket a dokumentumokat gyűjteményekbe csomagolja. Ha ezek közül az egyik dokumentumot szeretné keresni és kinyomtatni, több lehetőség is rendelkezésre áll. Az általánosabb MongoDB find keresési módszer mellett a MongoDB findOne egy rendkívül hatékony módszer a nagy adatbázisok pontos szűrésére.

A MongoDB findOne a felhasználó által megadott bizonyos kritériumok alapján keres minden dokumentumot és gyűjteményt. Ennek a módszernek az a különlegessége, hogy mindig pontosan egy dokumentumot ad vissza. Ha a keresési lekérdezésben csak egy dokumentum található, akkor ez a dokumentum kerül visszaadásra. Ha több dokumentum is megfelel a felhasználó által megadott paramétereknek, akkor a MongoDB findOne az adatbázis természetes sorrendjében elsőként megjelenő dokumentumot adja vissza. Ha a keresés során nem található dokumentum, akkor a kimenet „null”.

Mi a MongoDB findOne szintaxisa?

A MongoDB findOne alapvető szintaxisa egyszerű. A módszer így használható:

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

<query> alatt megadhatja, hogy a módszer hogyan szűrje a dokumentumokat.

<projection> alatt megadhatja, hogy mely mezők jelenjenek meg a visszaküldött dokumentumban. A 1 (igaz/bevonás) és 0 (hamis/kizárás) logikai értékekkel jelölheti, hogy egy mezőt be kell-e vonni. Ha ez a paraméter üres marad, akkor minden mező megjelenik.

A harmadik keresési paraméter <options> lehetővé teszi a keresés további módosítását és a megjelenítés megváltoztatását is. Mindhárom keresési paraméter opcionális.

Hogyan lehet tesztelési célokra gyűjteményt létrehozni?

Ha MongoDB-t telepített Linux, Windows vagy Mac rendszerre, és szeretné használni a MongoDB findOne parancsot, érdemes létrehozni egy tesztkörnyezetet, hogy kipróbálhassa a módszert.

Ha még nem hozott létre adatbázist, olvassa el átfogó MongoDB bemutatónkat, hogy megtanulja, hogyan kell létrehozni egyet. Az alábbi példában egy öt bejegyzést tartalmazó alkalmazotti adatbázist fogunk használni. Minden bejegyzés tartalmazza az alkalmazottak nevét, nemét és életkorát, valamint azt, hogy az adott személy mennyi ideje dolgozik a vállalatnál. A gyűjtemény így néz ki:

# 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

Milyen különböző módszerekkel lehet keresni a Mongo DB findOne segítségével?

A MongoDB findOne segítségével többféle módon is kereshetünk információkat. Kereshetünk paraméterek nélkül, azonosítóval, egy mezővel vagy több mezővel.

Paraméterek nélküli keresés

Ha a MongoDB findOne metódust paraméterek nélkül használja, a rendszer átkutatja az adatbázist, és minden bejegyzést figyelembe vesz. Példánkban ez azt jelenti, hogy a metódus öt bejegyzést fog azonosítani. Mivel egyik dokumentumot sem zárják ki, és a metódus csak egy eredményt ad vissza, a MongoDB findOne az adatbázisba elsőként bevitt személyt fogja kiválasztani.

db.employee.findOne ( )
shell

A kimenet:

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

Keresés azonosító alapján

Általában valamilyen kritériumot szeretne megadni a kereséshez, hogy végül a valóban szükséges dokumentumot találja meg. A MongoDB findOne segítségével a dokumentumokat többek között az azonosítójuk alapján is keresheti.

A _id mező minden dokumentumban egyedi. Példánkban minden azonosító pontosan egy alkalmazottat jelöl. Ha a MongoDB findOne parancsot futtatja az objektum azonosítóval, pontosan azt az eredményt kapja, amit keres.

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

A kimenet így néz ki:

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

Keresés meghatározott mezők használatával

Ha nem ismeri az azonosítót, vagy más paraméterek alapján szeretne keresni a gyűjteményében, akkor a MongoDB findOne funkcióval is kereshet konkrét mezőkre. Ha csak egy dokumentum felel meg a paraméternek, akkor az a dokumentum jelenik meg. Ha azonban több dokumentum is megfelel a keresési feltételeknek, akkor a rendszer csak az első bejegyzést jeleníti meg.

Az alábbi példában minden olyan bejegyzést keresünk, amelynek neme „Férfi”. Íme a parancs:

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

Két bejegyzés felel meg ennek a feltételnek, azonban csak az egyik jelenik meg. A kimenet Mr. Brown alkalmazottat jeleníti meg:

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

Több mező használatával történő keresés

Lehetőség van a keresést tovább szűkíteni, hogy elkerülje az átfedéseket. Ez a kis mintagyűjteményünk esetében nem feltétlenül szükséges, de ha több száz vagy akár több ezer bejegyzéssel dolgozik, ez az opció nagyon hasznos lehet. A MongoDB findOne lehetővé teszi, hogy több mezőt is használjon a kereséshez. Ha egy alkalmazottat nem (férfi) és életkor alapján szeretne azonosítani, a következőket írhatja:

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

A kimenet ismét Mr. Brown-t mutatja, aki az egyetlen férfi és 40 éves személy a gyűjteményben. Ms. Jones ugyanolyan idős, de neme nem felel meg a kritériumoknak, így az eredmény a következő:

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

Hogyan állítsunk be feltételeket egy mezőhöz a MongoDB findOne segítségével

Lehetőség van egy adott mezőre vonatkozó feltételek meghatározására is, amelyeket keresési kritériumként lehet felhasználni. A következő példában csak a 30 év feletti alkalmazottakat keressük.

Ez a bejegyzés így néz ki:

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

Ez kizárja Mr. Cartwrightot. Mivel Ms. Smith 30 év feletti és az első a listán, ő jelenik meg az eredményként:

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

Hogyan lehet kizárni mezőket a MongoDB findOne segítségével?

Ha nagy mennyiségű információt tartalmazó gyűjteménye van, akkor a kimenet túl sok információt tartalmazhat. Szerencsére a MongoDB findOne lehetőséget kínál a mezők kizárására a kimenetből. A következő példában nem szeretnénk megjeleníteni az azonosítót, a nemet és az életkort a kimenetben.

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

A következő eredményt kapja:

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

Mi történik, ha a MongoDB findOne nem talál eredményeket a keresésemre?

Ha a MongoDB findOne keresés nem ad eredményt, akkor is megjelenik egy kimenet. A folyamat szemléltetésére megkeressük Ms. Larkhamot, aki nem szerepel a gyűjteményben.

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

Ennek eredménye:

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

Az ingyenes GUI MongoDB Compass megkönnyíti az adatbázis kezelését. A grafikus felhasználói felületről bővebben olvashat digitális útmutatónk egy másik cikkében.

Ugrás a főmenübe