sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo devolver solo el valor en MongoDB

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