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

MongoDB find()

V MongoDB db.collection.find() metoda vybere dokumenty v kolekci nebo zobrazení a vrátí kurzor na vybrané dokumenty..

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

Můžete jej použít k vrácení všech dokumentů, jen některých nebo pouze jednoho dokumentu. Můžete také určit, která pole se mají vrátit.

Je důležité si uvědomit, že ve skutečnosti nevrací dokumenty. Pouze vrací kurzor k dokumentům. Přesto je snazší říci, že „vrací dokumenty“ a obvykle se to tímto způsobem označuje – včetně tohoto článku 🙂

Vrátit všechny dokumenty

Zde je příklad k demonstraci.

db.pets.find() 

Výsledek:

{ "_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 } 

Zde používáme find() metoda pro vrácení všech dokumentů z pets sbírka. Víme, že to vrátí všechny dokumenty, protože jsme neposkytli žádná kritéria filtrování. Ve skutečnosti jsme neposkytli žádné argumenty.

Při volání bez argumentů find() vrátí všechny dokumenty z kolekce a vrátí všechna pole pro dokumenty.

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

db.pets.find({}) 

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.

Filtrovat výsledky

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

db.collection.find(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í výsledků. 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.find({"type":"Dog"}) 

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :"Pes", "váha" :10 }

To zúžilo výsledky pouze na ty dokumenty, které mají type pole s hodnotou Dog .

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.find({"weight": { $lt: 10 }}) 

Výsledek:

{ "_id" :3, "name" :"Mňau", "type" :"Kočka", "váha" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Kočka", "váha" :8 }{ "_id" :5, "jméno" :"Bruce", "type" :"Netopýr", "váha" :3 }

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.find({ "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.find({ 
    "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.find({ 
    "specs" : {
		"height" : 400
	}
 }) 

Formátování výsledků

Výsledek předchozího příkladu byl vrácen na jednom řádku. Můžete použít cursor.pretty() metoda pro konfiguraci kurzoru tak, aby zobrazoval výsledky v čitelnějším formátu.

Chcete-li použít pretty() přidejte jej do find() metoda.

Příklad:

db.pets.find({ "_id": 6 }).pretty() 

Výsledek:

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

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.find({ 
    "awards": "Top Dog"
}).pretty() 

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.find({ 
    "awards.0": "Top Dog"
}).pretty() 

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

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

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í find() 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 find() vypadá takto:

db.collection.find(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í).

Naše sbírka nyní obsahuje následující 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 }{ " _id" :6, "name" :"Aport", "type" :"Pes", "specifikace" :{ "výška" :400, "váha" :15, "barva" :"hnědá" } }{ "_id " :7, "name" :"Jake", "type" :"Pes", "ocenění" :[ "Top Dog", "Nejlepší pes", "Největší pes" ] }

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

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

Výsledek:

{ "_id" :1, "name" :"Wag", "type" :"Pes" }{ "_id" :2, "name" :"Brk", "type" :"Pes" }{ "_id" :3, "name" :"Mňau", "type" :"Kočka" }{ "_id" :4, "name" :"Scratch", "type" :"Kočka" }{ "_id" :5, "name" :"Bruce", "type" :"Bat" }{ "_id" :6, "name" :"Aport", "type" :"Pes" }{ "_id" :7, "name " :"Jake", "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.find({}, { _id: 0, name: 1, type: 1 }) 

Výsledek:

{ "jméno" :"Wag", "type" :"Pes" }{ "jméno" :"Štěkat", "type" :"Pes" }{ "jméno" :"Mňau", "typ" :"Kočka" }{ "jméno" :"Poškrábání", "typ" :"Kočka" }{ "jméno" :"Bruce", "typ" :"Netopýr" }{ "jméno" :"Načíst", "typ" :"Pes" }{ "jméno" :"Jake", "typ" :"Pes" }

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

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

Výsledek:

{ "jméno" :"Wag", "type" :"Pes" }{ "jméno" :"Štěkat", "type" :"Pes" }{ "jméno" :"Mňau", "typ" :"Kočka" }{ "jméno" :"Poškrábání", "typ" :"Kočka" }{ "jméno" :"Bruce", "typ" :"Netopýr" }{ "jméno" :"Načíst", "typ" :"Pes" }{ "jméno" :"Jake", "typ" :"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.find({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Výsledek:

{ "n" :"Wag", "t" :"Pes", "w" :20 }{ "n" :"Štěkání", "t" :"Pes", "w" :10 }{ "n" :"Mňau", "t" :"Kočka", "w" :7 }{ "n" :"Poškrábání", "t" :"Kočka", "w" :8 }{ "n" :"Bruce", "t" :"Netopýr", "w" :3 }{ "n" :"Aport", "t" :"Pes" }{ "n" :"Jake", "t" :"Pes" " }

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. redis pro protokolování

  2. Přehled Atlasu MongoDB:Část druhá

  3. Rozdělte řetězec na pole podřetězců nebo znaků v MongoDB

  4. Reference dokumentu Mongoose se vztahem jedna k mnoha