Metoda findOne v MongoDB je skvělá pro vyhledávání v kolekci. Vrací však pouze jeden výsledek, což ji činí nevhodnou pro mnoho typů vyhledávání.

Co je MongoDB findOne?

MongoDB je systém pro správu databází, který díky svému přístupu NoSQL a pozoruhodné škálovatelnosti umožňuje snadné ukládání a správu velkých objemů dat. Tyto vlastnosti sice uživatelům přinášejí značné výhody, ale zároveň to znamená, že systém potřebuje účinné metody, aby uživatelé mohli v databázi efektivně navigovat.

Systém ukládá data všech typů ve formě dokumentu BSON (binární JSON) a tyto dokumenty sdružuje do kolekcí. Pokud chcete vyhledat a vypsat jeden z těchto dokumentů, máte k dispozici několik možností. Kromě obecnější metody vyhledávání MongoDB find je MongoDB findOne velmi účinnou metodou pro přesné filtrování velkých databází.

MongoDB findOne prohledává všechny dokumenty a kolekce podle určitých kritérií zadaných uživatelem. Zvláštností této metody je, že vždy vrátí přesně jeden dokument. Pokud je ve vyhledávacím dotazu pouze jeden dokument, bude tento dokument vrácen. Pokud několik dokumentů odpovídá parametrům definovaným uživatelem, MongoDB findOne vrátí dokument, který se objeví jako první v přirozeném pořadí databáze. Pokud při vyhledávání nelze najít žádné dokumenty, výstupem je „null“.

Jaká je syntaxe pro MongoDB findOne?

Základní syntaxe MongoDB findOne je jednoduchá. Metoda se používá takto:

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

Pod <query> můžete určit, jak má metoda filtrovat dokumenty.

Pod <projection> můžete určit, která pole mají být zobrazena pro vrácený dokument. Pomocí logických hodnot 1 (true/zahrnout) a 0 (false/nevzít v úvahu) určete, zda má být pole zahrnuto. Pokud tento parametr zůstane prázdný, budou zobrazena všechna pole.

Třetí vyhledávací parametr <options> umožňuje dále upravit vyhledávání a také změnit zobrazení. Všechny tři vyhledávací parametry jsou volitelné.

Jak vytvořit kolekci pro testovací účely

Pokud jste nainstalovali MongoDB na Linux, Windows nebo Mac a chcete použít MongoDB findOne, vyplatí se nastavit testovací prostředí, abyste mohli s touto metodou experimentovat.

Pokud jste ještě nenastavili databázi, přečtěte si náš komplexní návod k MongoDB, kde se dozvíte, jak ji nastavit. V našem příkladu níže použijeme databázi zaměstnanců obsahující pět záznamů. Každý záznam obsahuje informace o jménu, pohlaví a věku zaměstnanců, stejně jako o tom, jak dlouho daná osoba ve společnosti pracuje. Sbírka vypadá takto:

# 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

Jaké jsou různé způsoby vyhledávání pomocí Mongo DB findOne?

Existuje více než jeden způsob vyhledávání informací pomocí MongoDB findOne. Můžete vyhledávat bez parametrů, pomocí ID, pomocí jednoho pole nebo pomocí několika polí.

Hledání bez parametrů

Pokud používáte metodu MongoDB findOne bez jakýchkoli parametrů, systém prohledá vaši databázi a zohlední všechny záznamy. V našem příkladu to znamená, že metoda identifikuje pět záznamů. Jelikož žádný z dokumentů není vyloučen a metoda vrací pouze jeden výsledek, MongoDB findOne vybere první osobu, která byla zadána do databáze.

db.employee.findOne ( )
shell

Výstup je:

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

Vyhledávání podle ID

Obvykle chcete zadat nějaká kritéria pro vyhledávání, abyste našli dokument, který skutečně potřebujete. Jedním ze způsobů, jak vyhledávat dokumenty pomocí MongoDB findOne, je vyhledávání podle ID.

Pole _id je v každém dokumentu jedinečné. V našem příkladu každé ID představuje přesně jednoho zaměstnance. Pokud spustíte MongoDB findOne pomocí ID objektu, získáte přesně ten výsledek, který hledáte.

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

Výstup vypadá takto:

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

Vyhledávání pomocí konkrétních polí

Pokud neznáte ID nebo chcete ve své sbírce vyhledávat podle jiných parametrů, můžete také použít MongoDB findOne k vyhledávání konkrétních polí. Pokud existuje pouze jeden dokument, který odpovídá parametru, bude zobrazen právě tento dokument. Pokud však vašim vyhledávacím kritériím odpovídá více dokumentů, systém zobrazí pouze první záznam.

V následujícím příkladu budeme hledat všechny záznamy, kde je jako pohlaví uvedeno „Male“ (muž). Zde je příkaz:

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

Existují dva záznamy, které odpovídají těmto kritériím, ale zobrazí se pouze jeden. Výstup zobrazí zaměstnance pana Browna:

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

Vyhledávání pomocí několika polí

Máte také možnost dále zúžit vyhledávání, abyste zabránili překrývání výsledků. U našeho malého vzorku to možná není nutné, ale pokud pracujete s několika stovkami nebo dokonce tisíci záznamů, tato možnost se hodí. MongoDB findOne vám umožňuje použít pro vyhledávání několik polí. Pokud chcete identifikovat zaměstnance podle pohlaví (muž) a věku, můžete napsat následující:

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

Výsledek opět ukazuje pana Browna, který je jediným mužem ve sbírce a je mu 40 let. Paní Jonesová je ve stejném věku, ale její pohlaví nesplňuje kritéria, takže výsledek vypadá takto:

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

Jak nastavit podmínky pro pole pomocí MongoDB findOne

Je také možné definovat podmínky pro konkrétní pole a použít je jako kritéria vyhledávání. V následujícím příkladu vyhledáváme pouze zaměstnance starší 30 let.

Tento záznam vypadá takto:

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

To vylučuje pana Cartwrighta. Jelikož paní Smithová je starší 30 let a je první osobou v seznamu, objeví se jako výsledek:

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

Jak vyloučit pole pomocí MongoDB findOne

Pokud máte rozsáhlé kolekce, které obsahují velké množství informací, výstup může obsahovat příliš mnoho informací. Naštěstí MongoDB findOne nabízí také možnost vyloučit pole z výstupu. V následujícím příkladu nechceme ve výstupu zobrazovat ID, pohlaví a věk.

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

Zobrazí se následující výstup:

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

Co se stane, pokud MongoDB findOne nenajde žádné výsledky pro mé vyhledávání?

Pokud vaše vyhledávání pomocí MongoDB findOne nepřinese žádné výsledky, výstup se přesto zobrazí. Abychom ilustrovali, co se stane, vyhledáme paní Larkhamovou, která v kolekci není.

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

Výstupem je:

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

Bezplatné grafické uživatelské rozhraní MongoDB Compass usnadňuje správu databáze. Více informací o grafickém uživatelském rozhraní najdete v jiném článku našeho digitálního průvodce.

Přejít do hlavního menu