sql >> Database >  >> NoSQL >> MongoDB

MongoDB vinden()

In MongoDB de db.collection.find() methode selecteert documenten in een verzameling of weergave en brengt een cursor terug naar de geselecteerde documenten..

De collection deel is de naam van de collectie of weergave die moet worden doorzocht.

U kunt het gebruiken om alle documenten te retourneren, slechts enkele of slechts één document. U kunt ook specificeren welke velden moeten worden geretourneerd.

Het is belangrijk op te merken dat het de documenten niet daadwerkelijk terugstuurt. Het retourneert alleen een cursor naar de documenten. Dat gezegd hebbende, is het gemakkelijker om te zeggen dat het "documenten retourneert", en er wordt meestal zo naar verwezen - ook in dit artikel 🙂

Alle documenten retourneren

Hier is een voorbeeld om te demonstreren.

db.pets.find()

Resultaat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

Hier gebruiken we de find() methode om alle documenten van de pets . terug te sturen verzameling. We weten dat dit alle documenten retourneert omdat we geen filtercriteria hebben opgegeven. In feite hebben we geen argumenten gegeven.

Wanneer aangeroepen zonder argumenten, find() retourneert alle documenten uit een verzameling en retourneert alle velden voor de documenten.

Een andere manier om het bovenstaande te doen is als volgt:

db.pets.find({})

In dit geval geven we een leeg document door.

Door aan dit lege document toe te voegen, kunnen we beginnen met het filteren van de resultaten.

Filter de resultaten

De daadwerkelijke syntaxis van find() gaat als volgt:

db.collection.find(query, projection)

Dit betekent dat u een query als het eerste argument kunt doorgeven en een projectie als het tweede.

Als u een zoekopdracht doorgeeft, wordt deze gebruikt om de resultaten te filteren. Een query is een document dat query-operators bevat. Zoals we in het vorige voorbeeld zagen, retourneert een leeg document alle documenten.

Laten we de resultaten beperken tot een subset van documenten in de collectie.

db.pets.find({"type":"Dog"})

Resultaat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }

Dit beperkte de resultaten tot alleen die documenten met een type veld met een waarde van Dog .

In dit geval hebben we gewoon een document doorgegeven als filtercriterium.

U kunt ook query-operators gebruiken. Hiermee kunt u specifiekere criteria toepassen op uw vraag.

Voorbeeld:

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

Resultaat:

{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }

Ingesloten documenten

Als u documenten heeft die ingesloten documenten bevatten, kunt u de volgende methoden gebruiken om gegevens in de ingesloten documenten op te vragen.

  • Puntnotatie (bijv. field.nestedfield: <value> )
  • Genest formulier (bijv. { field: { nestedfield: <value> } } ). Merk op dat deze optie alleen beschikbaar is vanaf MongoDB 4.4.

Stel dat we het volgende document invoegen.

db.pets.insertOne({
    "_id" : 6,
    "name" : "Fetch",
    "type" : "Dog",
    "specs" : {
        "height" : 400,
        "weight" : 15,
        "color" : "brown"
    }
})

We kunnen puntnotatie gebruiken om te zoeken in het ingesloten document.

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

Resultaat:

{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }

De volgende query retourneert hetzelfde document, behalve dat we deze keer verwijzen naar het ingesloten document met een geneste vorm.

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

Resultaat:

{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }

Bij gebruik van het geneste formulier moet de query exact overeenkomen met het hele ingesloten document. De volgende zoekopdracht komt bijvoorbeeld niet overeen:

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

Maak de resultaten op

Het resultaat van het vorige voorbeeld werd op één regel geretourneerd. U kunt de cursor.pretty() . gebruiken methode om de cursor te configureren om de resultaten in een beter leesbaar formaat weer te geven.

Om de pretty() . te gebruiken methode, voeg het toe aan de find() methode.

Voorbeeld:

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

Resultaat:

{
	"_id" : 6,
	"name" : "Fetch",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
}

Arrays

U kunt naar gegevens in arrays verwijzen door naar het array-element te verwijzen met zijn index of zijn waarde.

Stel dat we het volgende document invoegen:

db.pets.insertOne({
    "_id" : 7,
    "name" : "Jake",
    "type" : "Dog",
    "awards" : [
        "Top Dog",
        "Best Dog",
        "Biggest Dog"
    ]
})

Als we alle honden met de Top Dog-award wilden vinden, zouden we de volgende vraag kunnen schrijven (die de bovenstaande hond zal opleveren).

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

Resultaat:

{
	"_id" : 7,
	"name" : "Jake",
	"type" : "Dog",
	"awards" : [
		"Top Dog",
		"Best Dog",
		"Biggest Dog"
	]
}

U kunt de elementindex ook als volgt specificeren:

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

Om dat te doen, moet de opgegeven waarde zich in de opgegeven index bevinden. Daarom retourneert de volgende zoekopdracht niet dezelfde hond.

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

Merk op dat arrays op nul zijn gebaseerd, dus een index van 0 specificeert het eerste element, 1 specificeert het tweede element, enzovoort.

Projecties

Standaard worden alle documentvelden geretourneerd wanneer u find() . gebruikt . Maar u kunt indien nodig projecties gebruiken om het aantal geretourneerde velden te verminderen.

U herinnert zich misschien dat de syntaxis voor find() gaat als volgt:

db.collection.find(query, projection)

Waar query biedt de filtercriteria (die we in de bovenstaande voorbeelden hebben gedaan), en projection is een optionele projectie die aangeeft welke velden moeten worden geretourneerd uit overeenkomende documenten. Daarom, als we een projectie willen gebruiken, plaatsen we deze gewoon na de vraag.

Wanneer u een projectie gebruikt, kunt u de velden specificeren om op te nemen , de velden om uit te sluiten , of allebei. Om dit te doen, vermeldt u de naam van het veld en een 1 (om het op te nemen) of 0 (om het uit te sluiten).

Inmiddels bevat onze collectie de volgende documenten:

{ "_id" : 1, "name" : "Wag", "type" : "Dog", "weight" : 20 }
{ "_id" : 2, "name" : "Bark", "type" : "Dog", "weight" : 10 }
{ "_id" : 3, "name" : "Meow", "type" : "Cat", "weight" : 7 }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat", "weight" : 8 }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat", "weight" : 3 }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
{ "_id" : 7, "name" : "Jake", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }

Hier is een voorbeeld van het gebruik van een projectie om de velden te specificeren die moeten worden opgenomen:

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

Resultaat:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }
{ "_id" : 4, "name" : "Scratch", "type" : "Cat" }
{ "_id" : 5, "name" : "Bruce", "type" : "Bat" }
{ "_id" : 6, "name" : "Fetch", "type" : "Dog" }
{ "_id" : 7, "name" : "Jake", "type" : "Dog" }

Merk op dat de _id veld wordt geretourneerd, ook al hebben we het niet in onze projectie opgenomen. Dit veld is een uitzondering en wordt standaard opgenomen.

Als u de _id . niet wilt veld dat moet worden geretourneerd, moet u dit expliciet uitsluiten.

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

Resultaat:

{ "name" : "Wag", "type" : "Dog" }
{ "name" : "Bark", "type" : "Dog" }
{ "name" : "Meow", "type" : "Cat" }
{ "name" : "Scratch", "type" : "Cat" }
{ "name" : "Bruce", "type" : "Bat" }
{ "name" : "Fetch", "type" : "Dog" }
{ "name" : "Jake", "type" : "Dog" }

Hier is nog een voorbeeld, deze keer specificeren we alleen welke velden moeten worden uitgesloten.

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

Resultaat:

{ "name" : "Wag", "type" : "Dog" }
{ "name" : "Bark", "type" : "Dog" }
{ "name" : "Meow", "type" : "Cat" }
{ "name" : "Scratch", "type" : "Cat" }
{ "name" : "Bruce", "type" : "Bat" }
{ "name" : "Fetch", "type" : "Dog" }
{ "name" : "Jake", "type" : "Dog" }

Meer projecties

Er zijn verschillende andere dingen die u kunt doen met projecties. Vanaf MongDB 4.4 kunt u bijvoorbeeld aggregatie-expressies gebruiken om de waarde van een geprojecteerd veld op te geven.

Voorbeeld:

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

Resultaat:

{ "n" : "Wag", "t" : "Dog", "w" : 20 }
{ "n" : "Bark", "t" : "Dog", "w" : 10 }
{ "n" : "Meow", "t" : "Cat", "w" : 7 }
{ "n" : "Scratch", "t" : "Cat", "w" : 8 }
{ "n" : "Bruce", "t" : "Bat", "w" : 3 }
{ "n" : "Fetch", "t" : "Dog" }
{ "n" : "Jake", "t" : "Dog" }

Hier hebben we de veldnamen hernoemd. We hebben dit gedaan door voor elk veld een nieuwe naam op te geven als een letterlijke tekenreeks, met behulp van de $fieldName syntaxis om die veldwaarde uit te voeren. Het resultaat lijkt een beetje op het gebruik van aliassen in SQL.

Meer informatie

Zie de MongoDB-documentatie voor meer informatie.


  1. 6 Handige tools om MongoDB-prestaties te controleren

  2. ElastiCache Redis instellen met Elastic BeanStalk + Django

  3. Percona Live Frankfurt 2018 - Evenementoverzicht en onze sessies

  4. MongoDB $isoWeek