sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB findOne()

V MongoDB db.collection.findOne() metoda vrací jeden dokument, který splňuje zadaná kritéria dotazu na kolekci nebo pohled.

collection část je název kolekce nebo pohledu, který se má hledat.

findOne() je podobný find() , kromě findOne() vrátí pouze první dokument, který odpovídá kritériím filtru, podle přirozeného pořadí, které odráží pořadí dokumentů na disku.

find() metoda na druhé straně vrátí všechny odpovídající dokumenty.

Také findOne() vrátí skutečný dokument, zatímco find() pouze vrátí kurzor na každý dokument. Proto nemůžete použít kurzorové metody na findOne() jako můžete pomocí find() .

Příklad

Předpokládejme, že máme sbírku nazvanou pets s následujícími dokumenty:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }{ "_id" :3, "jméno" :"Mňau", "typ" :"Kočka", "váha" :7 }{ "_id" :4, "jméno" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 } 

Můžeme použít findOne() vrátit jeden dokument.

db.pets.findOne() 

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }

Zde jsme prohledali všechny dokumenty v pets sbírka. Víme, že to prohledalo všechny dokumenty, protože jsme neposkytli žádná kritéria filtrování. Neposkytli jsme ani žádné argumenty.

Při volání bez argumentů findOne() prohledá všechny dokumenty z kolekce a vrátí všechna pole pro odpovídající dokument.

Další způsob, jak provést výše uvedené, je tento:

db.pets.findOne({}) 

V tomto případě předáme prázdný dokument.

Přidáním do tohoto prázdného dokumentu můžeme začít filtrovat výsledky.

Zadejte dotaz

Skutečná syntaxe findOne() vypadá takto:

db.collection.findOne(query, projection) 

To znamená, že můžete předat dotaz jako první argument a projekci jako druhý.

Pokud předáte dotaz, použije se k filtrování rozsahu hledání pouze na ty dokumenty, které odpovídají dotazu. Dotaz je dokument, který obsahuje operátory dotazu. Jak jsme viděli v předchozím příkladu, prázdný dokument vrátí všechny dokumenty.

Zúžme výsledky na podmnožinu dokumentů ve sbírce.

db.pets.findOne({"type":"Cat"}) 

Výsledek:

{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }

Tím se vyhledávání zúžilo pouze na ty dokumenty, které mají type pole s hodnotou Cat a poté findOne() vrátil první dokument z tohoto výsledku.

V tomto případě jsme jednoduše předali dokument jako kritérium filtrování.

Můžete také použít operátory dotazů. Ty vám umožňují použít na váš dotaz konkrétnější kritéria.

Příklad:

db.pets.findOne({"weight": { $lt: 10 }}) 

Výsledek:

{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }

Vložené dokumenty

Pokud máte dokumenty, které obsahují vložené dokumenty, můžete k dotazování na data ve vložených dokumentech použít následující metody.

  • Tečkový zápis (např. field.nestedfield: <value> )
  • Vnořený formulář (např. { field: { nestedfield: <value> } } ). Všimněte si, že tato možnost je dostupná pouze od MongoDB 4.4.

Předpokládejme, že vložíme následující dokument.

db.pets.insertOne({ "_id" :6, "name" :"Fetch", "type" :"Pes", "specs" :{ "height" :400, "weight" :15, " barva" :"hnědá" }})

K dotazování v rámci vloženého dokumentu můžeme použít tečkovou notaci.

db.pets.findOne({ "specs.height": 400 }) 

Výsledek:

{ "_id" :6, "name" :"Fetch", "type" :"Pes", "specs" :{ "height" :400, "weight" :15, "color" :"hnědá" }}

Následující dotaz vrací stejný dokument, ale tentokrát odkazujeme na vložený dokument pomocí vnořeného formuláře.

db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Výsledek:

{ "_id" :6, "name" :"Fetch", "type" :"Pes", "specs" :{ "height" :400, "weight" :15, "color" :"hnědá" }}

Při použití vnořeného formuláře se dotaz musí přesně shodovat s celým vloženým dokumentem. Například následující dotaz neodpovídá:

db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Výsledek:

null

Pole

Na data v polích můžete odkazovat odkazováním na prvek pole podle jeho indexu nebo podle jeho hodnoty.

Předpokládejme, že vložíme následující dokument:

db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Pes", "awards" :[ "Top Dog", "Nejlepší pes", "Největší pes" " ]})

Pokud bychom chtěli najít všechny psy s oceněním Top Dog, mohli bychom napsat následující dotaz (který vrátí výše uvedeného psa).

db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Výsledek:

{ "_id" :7, "name" :"Jake", "type" :"Pes", "ocenění" :[ "Top Dog", "Nejlepší pes", "Největší pes" ]}

Můžete také zadat index prvku takto:

db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

To vyžaduje, aby zadaná hodnota byla na zadaném indexu. Proto následující dotaz nevrátí stejného psa.

db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Všimněte si, že pole jsou založena na nule, takže index 0 určuje první prvek, 1 určuje druhý prvek a tak dále.

Projekce

Ve výchozím nastavení jsou při použití findOne() vrácena všechna pole dokumentu . V případě potřeby však můžete použít projekce ke snížení počtu vrácených polí.

Možná si vzpomínáte, že syntaxe pro findOne() vypadá takto:

db.collection.findOne(query, projection) 

Kde query poskytuje kritéria filtrování (která jsme provedli ve výše uvedených příkladech) a projection je volitelná projekce, která určuje, která pole se mají vrátit ze všech odpovídajících dokumentů. Pokud tedy chceme použít projekci, dáme ji jednoduše za dotaz.

Když používáte projekci, můžete určit pole, která se mají zahrnout , pole, která se mají vyloučit , nebo oboje. Chcete-li to provést, zadejte název pole a buď 1 (pro zahrnutí) nebo 0 (pro vyloučení).

Zde je příklad použití projekce k určení polí, která mají být zahrnuta:

db.pets.findOne({}, { name: 1, type: 1 }) 

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes" }

Všimněte si, že _id pole se vrátí, i když jsme ho nezahrnuli do naší projekce. Toto pole je výjimkou a je zahrnuto ve výchozím nastavení.

Pokud nechcete _id pole, které má být vráceno, musíte jej výslovně vyloučit.

db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Výsledek:

{ "jméno" :"Wag", "type" :"Pes" }

Zde je další příklad, tentokrát pouze specifikujeme, která pole se mají vyloučit.

db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Výsledek:

{ "jméno" :"Wag", "type" :"Pes" }

Další projekce

S projekcemi můžete dělat různé další věci. Například od MongDB 4.4 můžete použít agregační výrazy k určení hodnoty projektovaného pole.

Příklad:

db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Výsledek:

{ "n" :"Wag", "t" :"Pes", "w" :20 }

Zde jsme přejmenovali názvy polí. Udělali jsme to zadáním nového názvu pro každé pole jako řetězcový literál pomocí $fieldName syntaxe pro výstup hodnoty tohoto pole. Výsledek je trochu jako použití aliasů v SQL.

Další informace

Další informace naleznete v dokumentaci MongoDB.


  1. Proč jedna instance Jedis není bezpečná pro vlákna?

  2. Jak filtrovat pole ve vnořeném dokumentu s MongoDB

  3. Omezujete výsledky v MongoDB, ale stále získáváte plný počet?

  4. Jak najít nepoužívané indexy v MongoDB?