Cuando usa métodos como find()
o findOne()
en MongoDB, de forma predeterminada, se devuelve el documento completo. Y si usa proyecciones, puede devolver pares clave/valor específicos.
Pero, ¿y si solo quieres el valor?
Puede extraer el valor de un campo agregando el nombre de ese campo a su consulta al usar findOne()
.
Ejemplo
Supongamos que tenemos una colección llamada products
con los siguientes documentos:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
Si quisiéramos devolver el producto del primer documento, podríamos hacer lo siguiente:
db.products.findOne().product
Resultado:
Bat
Tenga en cuenta que usamos findOne()
método. Esta técnica no funciona en find()
método. El findOne()
método devuelve un solo documento, mientras que el método find()
simplemente devuelve un cursor al documento.
Si quisiéramos devolver la matriz, podríamos hacer esto:
db.products.findOne().sizes
Resultado:
[ "S", "M", "L" ]
Y podemos obtener un valor de matriz haciendo referencia a su índice:
db.products.findOne().sizes[0]
Resultado:
S
Las matrices están basadas en cero, por lo que 0
hace referencia al primer elemento de la matriz, 1
hace referencia al segundo elemento, 2
el tercero, y así sucesivamente.
Documento Específico
Por defecto, findOne()
El método devuelve el primer documento de la colección. Podemos seleccionar un documento diferente especificando pasar una consulta como primer argumento.
Digo "primer argumento" porque findOne()
también acepta una projection
argumento como un segundo argumento opcional.
db.products.findOne({_id: 2}, {sizes: 1, _id: 0}).sizes
Resultado:
[ "S", "L", "XL" ]
En este caso agregué un argumento de proyección, pero no tuvo efecto en el resultado. Pero habría tenido un efecto si hubiera especificado un valor de 0. Eso habría dado como resultado que no se devolviera nada.
Documentos incrustados
Puede usar la notación de puntos para devolver valores de documentos incrustados
Documento de ejemplo:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20 } }
Podríamos hacer lo siguiente para devolver un valor del documento incrustado:
db.pets.findOne().details.type
Resultado:
Dog