Buscar documentos en MongoDB

búsqueda de documentos en MongoDBEste es el segundo artículo correspondiente a las operaciones CRUD en MongoDB (Create, Read, Update, Delete). En el artículo anterior se mostró como insertar documentos en MongoDB y en este se va ver cómo buscar de documentos en MongoDB de forma general (en el siguiente se verá como hacerlo mediante filtros y criterios específicos de búsqueda)

MongoDB provee de distintas formas para encontrar documentos dentro de una determinada colección, desde consultas para mostrar todos los documentos, según unos determinados criterios de búsqueda o incluso solicitando un documento cualquiera.

Se presupone que ya tenéis un servidor de MongoDB instalado y arrancado. El primer paso será conectase como cliente contra la base de datos:

$ mongo
MongoDB shell version: 2.2.3
connecting to: test
>

Si habéis realizado el tutorial anterior, tendréis una colección “people” con varios documentos almacenados. Para facilitar la comprensión de estos ejemplos vamos a proceder a borrarla:

db.people.drop()

Método findOne de MongoDB

El método findOne simplemente solicita a la colección que le devuelva un documento cualquiera, escogido de forma arbritaria, y este se mostrará en un formato correctamente indentado y muy facilmente legible (lo que se conoce como “pretty”).

Primeramente insertamos un documento en la coleccion “people”:

> db.people.insert({ name: "Sara", age: 25, colors: ["blue", "gree", "red"], hobbies: ["listen music", "running"] })

Actualmente sólo tenemos este documento por lo que “findOne” nos lo mostrará sí o sí:

> db.people.findOne()
{
    "_id" : ObjectId("513c7d88cd61c58d37e32708"),
    "name" : "Sara",
    "age" : 25,
    "colors" : [
        "blue",
        "gree",
        "red"
    ],
    "hobbies" : [
        "listen music",
        "running"
    ]
}

En caso de tener más de un documento nos mostraría cualquiera de ellos.

Además, se puede solicitar un documento indicando un criterio o filtro de búsqueda cualquiera, por ejemplo, se puede querer un documento que contenga el campo clave “name” con valor “Jose David”. Primero se añaden algunos documentos más:

> db.people.insert({ name: "Jose David", age: 25, colors: ["blue", "gree", "red"], hobbies: ["listen music", "running"] })
> db.people.insert({ name: "Peter", age: 30, colors: ["blue", "gree", "red"], hobbies: ["listen music", "running"] })

Y ahora solicitamos a la base de datos MongoDB un documento cualquiera que cumpla con el criterio de búsqueda indicado:

> db.people.findOne( { name: "Jose David" } )
{
    "_id" : ObjectId("513c80a7cd61c58d37e3270c"),
    "name" : "Jose David",
    "age" : 25,
    "colors" : [
        "blue",
        "gree",
        "red"
    ],
    "hobbies" : [
        "listen music",
        "running"
    ]
}

En caso de que existieran varios documentos que coincidan con el patrón de búsqueda simplemente mostraría uno de ellos.

Esta funcionalidad es muy útil para conocer de forma rápida el formato que tienen los documentos almacenados en una determinada colección (aunque el formato puede variar para cada documento lo normal es que tengan uno en común o muy parecido).

Método find de MongoDB

El método find sirve para realizar búsquedas sobre una determinada colección de la base de datos, pudiendo especificar los criterios de búsqueda concretos para obtener todos los documentos que coincidan con el criterio de búsqueda especificado, o todos los documentos sino se especifica.

Obtener todos los documentos

Para obtener todos los documentos de una colección se usa el método find sin ningún parámetro:

> db.people.find()
{ "_id" : ObjectId("513c809bcd61c58d37e3270b"), "name" : "Sara", "age" : 25, "colors" : [ "blue", "gree", "red" ], "hobbies" : [ "listen music", "running" ] }
{ "_id" : ObjectId("513c80a7cd61c58d37e3270c"), "name" : "Jose David", "age" : 25, "colors" : [ "blue", "gree", "red" ], "hobbies" : [ "listen music", "running" ] }
{ "_id" : ObjectId("513c80b2cd61c58d37e3270d"), "name" : "Peter", "age" : 30, "colors" : [ "blue", "gree", "red" ], "hobbies" : [ "listen music", "running" ] }

Para mostrar los resultados de una forma más legible se puede añadir el método pretty. Esto es muy últil para poder visualizar de forma más cómoda documentos con gran cantidad de información contenida:

> db.people.find().pretty()
{
    "_id" : ObjectId("513c809bcd61c58d37e3270b"),
    "name" : "Sara",
    "age" : 25,
    "colors" : [
        "blue",
        "gree",
        "red"
    ],
    "hobbies" : [
        "listen music",
        "running"
    ]
}
{
    "_id" : ObjectId("513c80a7cd61c58d37e3270c"),
    "name" : "Jose David",
    "age" : 25,
    "colors" : [
        "blue",
        "gree",
        "red"
    ],
    "hobbies" : [
        "listen music",
        "running"
    ]
}
{
    "_id" : ObjectId("513c80b2cd61c58d37e3270d"),
    "name" : "Peter",
    "age" : 30,
    "colors" : [
        "blue",
        "gree",
        "red"
    ],
    "hobbies" : [
        "listen music",
        "running"
    ]
}

A la hora de realizar una consulta lo más común es que se quiera realizar algún tipo de filtro para obtener resultados más concretos y, de este modo, obtener sólo los documentos que cumplan una serie de criterios o filtros de búsqueda.

Antes de continuar, se van a eliminar los documentos de la colección “people” y vamos a insertar una gran cantidad de documentos para poder realizar los ejemplos con criterios de busquedas. Aprovecharemos que la shell de MongoDB es un intérprete de JavaScript y vamos a insertar 1000  documentos con información variable:

> for (i = 0; i < 1000; i++) { names = ["exam", "essay", "quiz"]; for (j = 0; j < 3; j++) { db.scores.insert({ student: i, type: names[j], score: Math.round(Math.random()*100) }) } }

La información que contiene cada uno de los documentos es la siguiente:

> db.scores.findOne()
{
    "_id" : ObjectId("513c8538cd61c58d37e332c6"),
    "student" : 0,
    "type" : "exam",
    "score" : 56
}

Esto indica que tenemos una serie de estudiantes numerados (student), que han realizado cada uno de los tipos de evaluación existentes (type) y han obtenido una determinada puntuación (score) en cada uno de ellos.

En la colección “scores” ya tenemos una gran cantidad de documentos por lo que si realizamos una consulta find sin argumentos nos mostrará sólo un número determinado de documentos y, mediante el comando “it“, se pueden ir obteniendo los siguientes:

> db.scores.find()
{ "_id" : ObjectId("513c8538cd61c58d37e332c6"), "student" : 0, "type" : "exam", "score" : 56 }
...
{ "_id" : ObjectId("513c8538cd61c58d37e332d9"), "student" : 6, "type" : "essay", "score" : 30 }
Type "it" for more
>
> it
{ "_id" : ObjectId("513c8538cd61c58d37e332da"), "student" : 6, "type" : "quiz", "score" : 94 }
...

Contar documentos en MongoDB

Otra utilidad que puede ser muy útil a la hora de desarrollar nuestras aplicaciones es la de obtener el total de documentos que hay almacenados en una determinada colección. Esto puede ser usado para paginación o mostrar los totales según los filtros aplicados.

> db.people.count()
12

Conclusión

En este artículo se ha visto una mera introducción a las funcionalidades más simples y genéricas para buscar documentos en MongoDB, los cuales por sí solos no bastan para prácticamente ninguna aplicación que se quiera realizar, salvo que esta sea meros listados y sin ningún tipo de filtros. En el siguiente tutorial se van a ver los distintos filtros de búsqueda que se pueden realizar sobre MongoDB.

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