Consultas en MongoDB usando dot notation

Tutorial de MongoDB con JavaContinuamos con la serie de artículos correspondientes a las operaciones CRUD en MongoDB (Create, Read, Update, Delete). En artículos anteriores se ha visto cómo insertar documentos en MongoDB, varias opciones a la hora de buscar documentos en MongoDB e incluso una introducción a las expresiones regulares en MongoDB.

En este tutorial se va a mostrar como realizar consultas en MongoDB usando dot notation para el acceso directo al contenido de los subdocumentos que existan dentro de otros documentos.

Insertar documentos con subdocumentos en MongoDB

El primer paso es insertar algunos documentos que contengan en su interior subdocumentos. Esto es tan simple que se ve rápidamente con un ejemplo:

> db.users.insert( { name: "Peter", email: { work: "peterwork@happyminds.es", personal: "peterpersonal@happyminds.es"} } )
> db.users.findOne()
{
	"_id" : ObjectId("513b2c0c1042e447a6c00ed6"),
	"name" : "Peter",
	"email" : {
		"work" : "peterwork@happyminds.es",
		"personal" : "peterpersonal@happyminds.es"
	}
}

Como se puede observar, la clave “email” es un subdocumento que contiene las claves “work” y “personal” las cuales contienen una dirección email. Recordad que el comando findOne muestra la salida en formato “pretty” por defecto para una mejor visibilidad de la estructura del documento.

Búsqueda sin dot notation en MongoDB

Antes de adentrarse en el uso de la notación por puntos para la búsqueda en subdocumentos se va a mostrar las limitaciones que tiene la búsqueda convencional para este tipo de claves y por qué no es conveniente su uso.

La búsqueda, por ejemplo, sería:

> db.users.find({ email: { "work" : "peterwork@happyminds.es", "personal" : "peterpersonal@happyminds.es" }}).pretty()
{
	"_id" : ObjectId("513b2c0c1042e447a6c00ed6"),
	"name" : "Peter",
	"email" : {
		"work" : "peterwork@happyminds.es",
		"personal" : "peterpersonal@happyminds.es"
	}
}

En este caso sería necesario e importante preservar el orden de los campos “work” y “personal” y, además, buscar por ambas claves ya que de otro modo el documento no sería encontrado, es decir, la búsqueda se tiene que realizar por documento completo y ordenado.

Si se prueba a realizar una búsqueda parcial se ve cómo no encuentra nada:

> db.users.find({ email: { "work" : "peterwork@happyminds.es" }})
>

Esto es un inconveniente bastante grande a la hora de realizar consultas en subdocumentos y, por ello, es necesario el uso de la anotación por puntos.

Consultas en MongoDB usando dot notation

Dot notation quiere decir sencillamente que para acceder a una clave de un subdocumento se va a usar la nomenclatura key.subkey, siendo key la clave que contiene el subdocumento y subkey una clave dentro de dicho subdocumento.

Con esta notación se puede acceder directamente a las claves del subdocumento “email” para consultar directamente sobre ellas:

> db.users.find({ "email.work": "peterwork@happyminds.es"}).pretty()
{
	"_id" : ObjectId("513b2c0c1042e447a6c00ed6"),
	"name" : "Peter",
	"email" : {
		"work" : "peterwork@happyminds.es",
		"personal" : "peterpersonal@happyminds.es"
	}
}

Un ejemplo algo más completo sería buscar, teniendo documentos con el formato expuesto a continuación, los que posean un precio mayor que 10000 y una clasificación de 5 o más puntos:

{ product : "Super product name",
price : 100000000000,
reviews : [ { user : "fred", comment : "Great!" , rating : 5 },
{ user : "tom" , comment : "I agree with Fred, somewhat!" , rating : 4 } ],
... }

La consulta en cuestión sería la siguiente:

db.catalog.find({ price: { $gt: 10000 }, "reviews.rating": { $gte: 5} })

Conclusión

Como se puede apreciar de los contenidos expuestos en este artículo, las consultas en MongoDB usando dot notation no es que presenten grandes ventajas sino que son totalmente necesarias para acceder de forma práctica al contenido de subdocumentos y poder realizar búsquedas y consultas sobre sus datos.

Si este artículo le ha resultado interesante le animo a seguir de forma activa el tutorial de MongoDB con Java.

Happy Minds!!!

Share on FacebookTweet about this on TwitterShare on LinkedInShare on RedditShare on Google+Digg thisShare on TumblrPin on PinterestBuffer this pagePrint this pageEmail this to someone