MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB trova()

In MongoDB il db.collection.find() il metodo seleziona i documenti in una raccolta o vista e riporta un cursore sui documenti selezionati..

La collection part è il nome della raccolta o della vista da cercare.

Puoi usarlo per restituire tutti i documenti, solo alcuni o solo un documento. Puoi anche specificare quali campi devono essere restituiti.

È importante notare che in realtà non restituisce i documenti. Restituisce semplicemente un cursore ai documenti. Detto questo, è più facile dire che "restituisce documenti" e in genere viene indicato in questo modo, anche in questo articolo 🙂

Restituisci tutti i documenti

Ecco un esempio da dimostrare.

db.pets.find()

Risultato:

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

Qui utilizziamo find() metodo per restituire tutti i documenti da pets collezione. Sappiamo che questo restituisce tutti i documenti perché non abbiamo fornito alcun criterio di filtro. In effetti, non abbiamo fornito argomenti.

Quando viene chiamato senza argomenti, find() restituisce tutti i documenti da una raccolta e restituisce tutti i campi per i documenti.

Un altro modo per fare quanto sopra è questo:

db.pets.find({})

In questo caso passiamo un documento vuoto.

Aggiungendo a questo documento vuoto, possiamo iniziare a filtrare i risultati.

Filtra i risultati

La sintassi effettiva di find() va così:

db.collection.find(query, projection)

Ciò significa che puoi passare una query come primo argomento e una proiezione come secondo.

Se si passa una query, viene utilizzata per filtrare i risultati. Una query è un documento che contiene operatori di query. Come abbiamo visto nell'esempio precedente, un documento vuoto restituisce tutti i documenti.

Restringiamo i risultati a un sottoinsieme di documenti nella raccolta.

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

Risultato:

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

Ciò ha ristretto i risultati ai soli documenti che hanno un type campo con un valore di Dog .

In questo caso, abbiamo semplicemente passato un documento come criterio di filtraggio.

Puoi anche utilizzare gli operatori di query. Questi ti consentono di applicare criteri più specifici alla tua richiesta.

Esempio:

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

Risultato:

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

Documenti incorporati

Se disponi di documenti che contengono documenti incorporati, puoi utilizzare i seguenti metodi per eseguire query sui dati nei documenti incorporati.

  • Notazione punto (ad es. field.nestedfield: <value> )
  • Modulo nidificato (ad es. { field: { nestedfield: <value> } } ). Nota che questa opzione è disponibile solo da MongoDB 4.4.

Supponiamo di inserire il seguente documento.

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

Possiamo usare la notazione del punto per eseguire query all'interno del documento incorporato.

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

Risultato:

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

La query seguente restituisce lo stesso documento, tranne per il fatto che questa volta si fa riferimento al documento incorporato utilizzando il modulo nidificato.

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

Risultato:

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

Quando si utilizza il modulo nidificato, la query deve corrispondere esattamente all'intero documento incorporato. Ad esempio, la seguente query non corrisponde:

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

Formatta i risultati

Il risultato dell'esempio precedente è stato restituito in una riga. Puoi usare cursor.pretty() metodo per configurare il cursore per visualizzare i risultati in un formato più leggibile.

Per usare pretty() metodo, aggiungilo a find() metodo.

Esempio:

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

Risultato:

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

Array

Puoi fare riferimento ai dati negli array facendo riferimento all'elemento dell'array in base al suo indice o al suo valore.

Supponiamo di inserire il seguente documento:

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

Se volessimo trovare tutti i cani con il premio Top Dog, potremmo scrivere la seguente query (che restituirà il cane sopra).

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

Risultato:

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

Puoi anche specificare l'indice dell'elemento, in questo modo:

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

Ciò richiede che il valore specificato sia all'indice specificato. Pertanto, la query seguente non restituisce lo stesso cane.

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

Si noti che gli array sono in base zero, quindi un indice di 0 specifica il primo elemento, 1 specifica il secondo elemento e così via.

Proiezioni

Per impostazione predefinita, tutti i campi del documento vengono restituiti quando utilizzi find() . Ma puoi utilizzare le proiezioni per ridurre il numero di campi restituiti, se necessario.

Potresti ricordare che la sintassi per find() va così:

db.collection.find(query, projection)

Dove query fornisce i criteri di filtraggio (che abbiamo fatto negli esempi precedenti) e projection è una proiezione facoltativa che specifica quali campi restituire da eventuali documenti corrispondenti. Pertanto, se vogliamo utilizzare una proiezione, la inseriamo semplicemente dopo la query.

Quando utilizzi una proiezione, puoi specificare i campi da includere , i campi da escludere , o entrambi. Per fare ciò, elenca il nome del campo e un 1 (per includerlo) o 0 (per escluderlo).

La nostra collezione contiene ormai i seguenti documenti:

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

Ecco un esempio di utilizzo di una proiezione per specificare i campi da includere:

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

Risultato:

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

Nota che il _id il campo viene restituito anche se non lo abbiamo incluso nella nostra proiezione. Questo campo è un'eccezione ed è incluso per impostazione predefinita.

Se non vuoi il _id campo da restituire, è necessario escluderlo esplicitamente.

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

Risultato:

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

Ecco un altro esempio, questa volta specifichiamo solo quali campi escludere.

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

Risultato:

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

Altre proiezioni

Ci sono varie altre cose che puoi fare con le proiezioni. Ad esempio, a partire da MongDB 4.4 è possibile utilizzare espressioni aggregate per specificare il valore di un campo proiettato.

Esempio:

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

Risultato:

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

Qui, abbiamo rinominato i nomi dei campi. Lo abbiamo fatto specificando un nuovo nome per ogni campo come una stringa letterale, usando il $fieldName sintassi per generare il valore di quel campo. Il risultato è un po' come usare gli alias in SQL.

Maggiori informazioni

Consulta la documentazione di MongoDB per ulteriori informazioni.