Quando usi metodi come find()
o findOne()
in MongoDB, per impostazione predefinita viene restituito l'intero documento. E se usi le proiezioni, puoi restituire coppie chiave/valore specifiche.
Ma cosa succede se vuoi solo il valore?
Puoi estrarre il valore di un campo aggiungendo il nome di quel campo alla tua query quando usi findOne()
.
Esempio
Supponiamo di avere una collezione chiamata products
con i seguenti documenti:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
Se volessimo restituire il prodotto del primo documento, potremmo fare quanto segue:
db.products.findOne().product
Risultato:
Bat
Nota che abbiamo usato findOne()
metodo. Questa tecnica non funziona su find()
metodo. Il findOne()
il metodo restituisce un singolo documento, mentre il metodo find()
restituisce semplicemente un cursore al documento.
Se volessimo restituire l'array potremmo farlo:
db.products.findOne().sizes
Risultato:
[ "S", "M", "L" ]
E possiamo ottenere un valore di matrice facendo riferimento al suo indice:
db.products.findOne().sizes[0]
Risultato:
S
Gli array sono a base zero, quindi 0
fa riferimento al primo elemento dell'array, 1
fa riferimento al secondo elemento, 2
il terzo e così via.
Documento specifico
Per impostazione predefinita, findOne()
il metodo restituisce il primo documento della raccolta. Possiamo selezionare un documento diverso specificando il passaggio di una query come primo argomento.
Dico "primo argomento" perché findOne()
accetta anche una projection
argomento come secondo argomento facoltativo.
db.products.findOne({_id: 2}, {sizes: 1, _id: 0}).sizes
Risultato:
[ "S", "L", "XL" ]
In questo caso ho aggiunto un argomento di proiezione, ma non ha avuto alcun effetto sul risultato. Ma avrebbe avuto effetto se avessi specificato un valore pari a 0. Ciò non avrebbe comportato la restituzione di nulla.
Documenti incorporati
Puoi utilizzare la notazione a punti per restituire valori dai documenti incorporati
Esempio di documento:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20 } }
È possibile eseguire le seguenti operazioni per restituire un valore dal documento incorporato:
db.pets.findOne().details.type
Risultato:
Dog