You are on page 1of 37

Traduccin Manual Getting Started with MongoDB (MongoDB Shell Edition)

Introduccin a MongoDB
MongoDB es una base de datos para documentos de cdigo abierto, que
proporciona alto desarrollo, alta disponibilidad y escalado automtico.
MongoDB obvia la necesidad de un Objet Relational Mapping (ORM) para
facilitar el desarrollo.
Documentos
Un registro en MongoDB es denominado documento, y se trata de una
estructura de datos compuesta de pares clave-valor, por ello los documentos
son similares a los objetos JSON. El valor de los pares o campos pueden ser
tambin otros documentos, arrays y arrays de documentos.
Ejemplo:

{
"_id" : ObjectId("54c955492b7c8eb21818bd09"),
"address" : {
"street" : "2 Avenue",
"zipcode" : "10075",
"building" : "1480",
"coord" : [ -73.9557413, 40.7720266 ],
},
"borough" : "Manhattan",
"cuisine" : "Italian",
"grades" : [
{
"date" : ISODate("2014-10-01T00:00:00Z"),
"grade" : "A",
"score" : 11
},
{
"date" : ISODate("2014-01-16T00:00:00Z"),
"grade" : "B",
"score" : 17
}
],
"name" : "Vella",

"restaurant_id" : "41704620"
}

La sintaxis de los documentos como los objetos JSON o BSON es:
{ <campo1>:<valor> , <campo2>:<valor nmerico> }
En el caso de documentos embebidos se abrir de nuevo otra llave dentro del
documento que lo contiene. Por otra parte los arrays y arrays de documentos
se declaran con corchetes, como se comprueba en el ejemplo anterior.
Nota: En la declaracin de campos no son obligatorias las comillas cuando se
ejecutan instrucciones desde el Shell de MongoDB. No obstante, algunos
drivers de conexin de lenguajes de programacin pueden necesitar su uso.
Colecciones
MongoDB almacena los documentos en colecciones, siendo el equivalente a
las tablas en las bases de datos relacionales. En cambio, a diferencia de las
tablas, las colecciones no necesitan que los documentos que contiene tengan
el mismo esquema.
En MongoDB, los documentos almacenados en una coleccin deben tener un
campo con valor unvoco _id que acta como clave primaria.
Instalacin de MongoDB
Requerimientos
MongoDB Community Edition requiere Windows Server 2008 R2, Windows
Vista, o posteriores. El archivo instalador de extensin .msi incluye todas las
dependencias de software y automticamente actualizara cualquier versin
anterior de MongoDB instalada de la misma forma.
Nota: En las versiones Windows Server 2008 R2 Windows 7 es necesario
instalar el Hotfix de este enlace http://support.microsoft.com/kb/2731284

Conseguir MongoDB Community Edition en Windows


1 Determinar que versin de MongoDB necesitamos.
Existen actualmente tres versiones de MongoDB para Windows:
MongoDB for Windows 64-bit para Windows Server 2008 R2, Windows 7 64bit, el resto de versiones posteriores de Windows. Incluye las mejoras recientes
de MongoDB para Windows.
MongoDB for Windows 32-bit para cualquier versin de Windows de 32-bit
posterior a Vista. Solo soporta bases de datos inferiores a 2GB. Puede no estar
disponible en el futuro esta versin.
MongoDB for Windows 64-bit para Windows Vista, Windows Server 2003,
yWindows Server 2008. No incluye las mejoras recientes.
Para conocer la versin de Windows del equipo en el que trabajamos,
podemos usar en la lnea de comandos:

wmic os get caption


wmic os get osarchitecture

2 Descargar MongoDB para Windows.
La ltima release en produccin se descarga de la pgina web de descargas
de MongoDB, asegrandonos seleccionar la versin correcta ya que la versin
de 64-bit no funciona en sistemas de 32-bit.
Instalacin de MongoDB Community Edition en Windows.
Instalacin interactiva.
En el explorador de Windows, localizar el archivo .msi de MongoDB
descargado, que habitualmente estar en la carpeta de descargar. Realizar
doble clic sobre el mismo. Varias pantallas nos guiarn en el proceso de
instalacin, siendo posible especificar el directorio de instalacin si
seleccionamos la opcin de instalacin custom.

MongoDB es autocontenido y no tiene ninguna dependencia adicional en el


sistema. Es posible ejecutar MongoDB desde otro directorio diferente a C:\
que es en el que se instala por defecto.
Instalacin silenciosa.
Se puede llevar a cabo una instalacin automtica o silenciosa en la terminal
de comandos de Windows.
1 Abrimos la terminal de Windows como administrador.
Para ello pulsamos la tecla con el icono de Windows, tecleamos cmd.exe y
sobre el icono pulsamos con el ratn derecho seleccionando ejecutar como
administrador, aceptando la advertencia.
2 Instalamos MongoDB.
Se teclean las siguientes instrucciones:
msiexec.exe /q /i mongodb-win32-x86_64-2008plus-ssl-3.0.4signed.msi ^
INSTALLLOCATION="C:\mongodb" ^
ADDLOCAL="all"
Si se necesitar, se puede cambiar el directorio de instalacin cambiando el
valor de INSTALLLOCATION.
Por defecto, MongoDB instala todos los binarios a travs del argumento
ADDLOCAL, para instalar componentes especficos se pueden determinar en
este argumento, separados por comas los siguientes componentes:
Component Set

Server
Router
Client
MonitoringTools
ImportExportTools
MiscellaneousTools

Binaries

mongod.exe
mongos.exe
mongo.exe
mongostat.exe, mongotop.exe
mongodump.exe, mongorestore.exe, mongoexport.exe, mongoimport.exe
bsondump.exe, mongofiles.exe, mongooplog.exe, mongoperf.exe


Ejecucin MongoDB Community Edition
Advertencia: Se recomienda ejecutar MongoDB en redes publicas con la
configuracin auth. MongoDB est diseado para redes seguras y la base de
datos no dispone por defecto de modo seguro.

1 Establecer el ecosistema MongoDB.


MongoDB requiere un directorio de datos para almacenarlos. Por defecto, la
ruta de ese directorio es \data\db. Se puede crear desde la terminal de
windows con:
md \data\db\
Se puede especificar una ruta diferente para este directorio, usando la opcin
dbpath para el ejecutable (del servidor) mongod.exe como se muestra en
este ejemplo:
C:\mongodb\bin\mongod.exe --dbpath d:\test\mongodb\data
Si la ruta incluye espacios en los nombres de las carpetas hay que asegurarse
de incluir carpetas como se muestra en este otro ejemplo:
C:\mongodb\bin\mongod.exe --dbpath "d:\test\mongo db data"
Tambin se puede especificar el valor de dbpath en un archivo de
configuracin.
2 Arranque de MongoDB
Para arrancar MongoDB, ejecutar mongod.exe por ejemplo desde el prompt:
C:\mongodb\bin\mongod.exe
Esto inicializa el principal proceso de la base de datos MongoDB. El mensaje
waiting for connections que se muestra en la consola indica que el proceso
mongod.exe se esta ejecutando con xito.
Dependiendo del nivel de seguridad del sistema, Windows puede lanzar un
cuadro de dilogo de alerta indicando que algunas caractersticas de
comunicacin con las redes estn bloqueadas y debemos pulsar allow para
permitir el acceso a redes privadas. Para ms informacin sobre seguridad en
MongoDB debemos leer la Documentacin de Seguridad.
3 Conexin a MongoDB
Para conectarnos a la base de datos a travs del Shell de MongoDB, abrimos
una nueva terminal de la lnea de comandos de Windows y tecleamos:

C:\mongodb\bin\mongo.exe
Si queremos desarrollar aplicaciones usando .NET, obtendremos ms
informacin en http://docs.mongodb.org/ecosystem/drivers/csharp
Configurar un Servidor Windows para MongoDB Community Edition
1 Abrir la terminal de Windows como administrador.
2 Crear los directorios
Crear los directorios para las bases datos y log.
mkdir c:\data\db
mkdir c:\data\log
3 Crear un archivo de configuracin
El archivo debe ser del tipo systemLog.path, incluyendo las opciones de
configuracin apropiadas.
Por ejemplo, podemos crear un archivo en C:\mongodb\mongod.cfg que
espeficique systemLog.path y storage.dbPath:
systemLog:
destination: file
path: c:\data\log\mongod.log
storage:
dbPath: c:\data\db
4 Instalacin del servidor MongoDB
Importante: Ejecutar todas los comandos en la terminal de Windows con
autorizaciones de Administrador.
Instalamos el servidor MongoDB inicializando mongod.exe con la opcin
install y la opcin config para especificar los archivos creados en el paso
anterior. Por ejemplo:
"C:\mongodb\bin\mongod.exe" --config "C:\mongodb\mongod.cfg" install

Para usar una ruta alternativa, especificarla en el archivo de configuracin (e.g.


C:\mongodb\mongod.cfg) o en la lnea de comandos con la opcin --dbpath.
Si lo necesitramos, se pueden instalar servidores para mltiples instancias de
mongod.exe o mongos.exe. Se instala cada servidor con un nico -serviceName y --serviceDisplayName. Es recomendable usar mltiples
instancias slo cuando los recursos del sistema sean suficientes y nuestro
diseo lo requiera.
5 Inicializando el Servidor MongoDB
net start MongoDB
6 Parar o borrar el Servidor MongoDB
Para parar el servidor usamos:
net stop MongoDB
Para borrar el servidor usamos:
"C:\mongodb\bin\mongod.exe" --remove
Crear manualmente un Servidor Windows para MongoDB Community Edition
Se puede configurar el servidor MongoDB como un Servidor Windows que
arranque inmediatamente al iniciar el sistema.
Pasos 1 y 3 idnticos al anterior.
4 Crear el Servidor MongoDB
sc.exe create MongoDB binPath= "C:\mongodb\bin\mongod.exe --service -config=\"C:\mongodb\mongod.cfg\"" DisplayName= "MongoDB" start=
"auto"
El archivo sc.exe necesita espacio entre = y el valor de la ruta C:\... y barra
invertida \ para escapar las comillas de la propia ruta.
Si se crea con xito, se visualiza el siguiente log:

[SC] CreateService SUCCESS


Los pasos 5 y 6 son idnticos al caso anterior.

Importacin de un ejemplo de conjunto de datos.


Los ejemplos de esta gua son usados de una coleccin de datos de
restaurantes implementados en la base de datos test.
Este es un ejemplo de uno de los documentos:
{

"address": {
"building": "1007",
"coord": [ -73.856077, 40.848447 ],
"street": "Morris Park Ave",
"zipcode": "10462"
},
"borough": "Bronx",
"cuisine": "Bakery",
"grades": [
{ "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
{ "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
{ "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
{ "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
{ "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
],
"name": "Morris Park Bake Shop",
"restaurant_id": "30075445"

Usaremos el siguiente procedimiento para importar la coleccin.


Requisitos previos.
Debemos tener una instancia mongod para importar a la base de datos.

Procedimiento
1 Obtencin de datos.
Obtenemos el conjunto de datos de
https://raw.githubusercontent.com/mongodb/docs-assets/primerdataset/dataset.json
y lo guardamos a un archivo llamado primer-dataset.json.
Nota: Hay que asegurarse de grabarlo como .json sin la extesin webarchive u
otra que aadiera por defecto el navegador
2 Importacin de los datos a la coleccin.
En la terminal de windows, usamos mongoimport para insertar los documents
en la coleccin restaurants en la base de datos test. Si la coleccin ya existiera
en la base de datos test database, la operacin en primer lugar la borrar.
mongoimport --db test --collection restaurants --drop --file primer-dataset.json
Nota: teclear la instruccin en c:\bin\ que es donde se encuentra el ejecutable
mongoimport y ubicar el archivo en la misma ruta.
La operacin mongoimport conecta la instancia MongoDB en el puerto
nmero 27017 de localhost.
Para importar datos a una instancia mongod en un host o puerto diferente se
debe especificar el hostname o puerto incluyendo las opciones --host y --port
en el comando anterior.
MongoDB Shell (mongo)
La consola mongo es un interface interactivo JavaScript a MongoDB y est
incluido en el paquete MongoDB. Podemos usar la consola mongo tanto para
realizar consultas y actualizar datos como para desarrollar operaciones de
administracin de la base de datos.
Inicializacin de mongo

Una vez instalado e inicializado el servidor MongoDB, conectamos la consola


mongo a la instancia. Es imprescindible asegurarse de que MongoDB est en
servicio antes de lanzar la consola mongo.
Para ello, en el mismo sistema en el que est funcionando MongoDB, abrimos
la terminal de Windows e iniciamos la consola mongo con el siguiente
comando:
mongo
En caso de un sistema Windows, se lanza con el ejecutable aadiendo .exe.
mongo.exe
siendo necesario aadir la ruta correspondiente si estamos en un directorio
diferente al de este archivo.
Cuando iniciamos mongo sin ms argumentos, nos conectamos por defecto a
la interfaz localhost, puerto 27017 de la instancia MongoDB. Para un host o
puerto diferente podemos ver ms informacin en
http://docs.mongodb.org/manual/reference/program/mongo
Ayuda en la Consola Mongo.
Para obtener un listado de comandos con sus caractersticas, tecleamos:
help
La consola mongo proporciona autocompletado de comandos mediante el
tabulador as como atajos de teclado de manera similar al shell bash. Por
ejemplo, se pude usar la flecha hacia arriba y hacia abajo para recuperar las
instrucciones del historial.
Insercin de Datos en la Consola Mongo.
Podemos insertar documentos mediante el mtodo insert() a una coleccin de
MongoDB. Como el mtodo exige determinar a qu coleccin se van a
insertar los documentos, si esa coleccin no existiese, se crea al mismo tiempo
que insertamos los documentos.
Requisitos previos.

En la consola mongo, nos conectamos a la base de datos test, usando para


ello:
use test
Este mismo comando sirve para crear una base de datos en caso de que no
existiera.
Insercin de un Documento.
Insertamos un documento en la coleccin restaurants, en caso de que no
existiese la coleccin se creara al mismo tiempo:
db.restaurants.insert(
{
"address" : {
"street" : "2 Avenue",
"zipcode" : "10075",
"building" : "1480",
"coord" : [ -73.9557413, 40.7720266 ],
},
"borough" : "Manhattan",
"cuisine" : "Italian",
"grades" : [
{
"date" : ISODate("2014-10-01T00:00:00Z"),
"grade" : "A",
"score" : 11
},
{
"date" : ISODate("2014-01-16T00:00:00Z"),
"grade" : "B",
"score" : 17
}
],
"name" : "Vella",
"restaurant_id" : "41704620"
}
)
Una vez introducido, el sistema devuelve un objeto WriteResult con el estatus
de la operacin:

WriteResult({ "nInserted" : 1 })
Si no pasamos en el mtodo insert() ningn campo _id, la consola mongo
automticamente aade al documento este campo dndole valor a travs de
un ObjectId generado automticamente.
Buscar o Consultar Datos con la Consola Mongo.
Usamos el mtodo find() para realizar una consulta y obtener datos de una
coleccin en MongoDB. Todas las consultas en MongoDB se ejecutan en el
mbito de una coleccin simple.
Las consultas pueden devolver todos los documentos de una coleccin o solo
los que cumplan unos criterios o filtros especficos. Se pueden especificar los
filtros o criterios de los documentos al pasarlos como parmetros del mtodo
find().
El mtodo find() devuelve los resultados a un cursor, que es un objeto iterado
con los documentos producidos (por el mtodo de consulta).
Requisitos previos.
Los ejemplos de esta seccin utilizan la coleccin restaurants de la base de
datos test, cuyas instrucciones de importacin fueron detalladas
anteriormente.
En la consola mongo conectada a la instancia en funcionamiento mongod, nos
conectamos a la base de datos test.
use test
Consultas para todos los Documentos de una Coleccin.
Para devolver todos los documentos de una coleccin, llamamos al mtodo sin
ningn criterio de documento. Por ejemplo, la siguiente operacin devuelve
todos los documentos de la coleccin restaurants.
db.restaurants.find()
El resultado contiene todos los documentos de la coleccin.

Especificar condiciones de igualdad.


Para especificar en el mtodo de bsqueda, condiciones o criterios de
igualdad usamos la sintaxis:
{ <field1>: <value1>, <field2>: <value2>, ... }
Si el campo <field> es primario y no es un campo que este en un documento
embebido o un array, se pueden usar u omitir las comillas cuando lo
introducimos en los parmetros del mtodo.
En el caso de que el campo <field> est en un documento embebido o en un
array, se usa la notacin del punto para acceder al mismo. Con la notacin del
punto, es necesario incluir entre comillas el campo.
Consulta con un campo primario.
La siguiente operacin busca documentos en los que el campo borough sea
igual Manhattan.
db.restaurants.find( { "borough": "Manhattan" } )
La consulta solo devolver los documentos que cumplan esta condicin.
Consulta con un campo de un documento embebido.
Para especificar una condicin de un campo que est en un documento
embebido, usamos la notacin del punto. Esta, requiere introducir entre
comillas el nombre del campo. El siguiente ejemplo especifica una operacin
con una condicin de igualdad en la que el campo zipcode est en el
documento embebido denominado address.
db.restaurants.find( { "address.zipcode": "10075" } )
El resultado devolver solo los documentos que cumplan esta condicin.
Consulta con un campo en un array de documentos.
En el ejemplo, el array grades est compuesto de documentos embebidos.
Para especificar una condicin con uno de los campos en esos documentos,
usamos las notacin del punto, que tambin requiere entrecomillado del

campo y documento. La siguiente consulta para documentos cuyo array


grades contenga un documento con un campo grade igual a B sera:
db.restaurants.find( { "grades.grade": "B" } )
El resultado devolver solo los documentos que cumplan esta condicin.

Especificar condiciones con operadores.


MongoDB proporciona operadores para especificar condiciones en las
consultas, como por ejemplo los operadores de comparacin.
Aunque hay algunas excepciones , como los operadores condicionales $or y
$and, las condiciones de las consultas usan los operadores generalmente de la
siguiente forma:
{ <field1>: { <operator1>: <value1> } }
Podemos consultar la lista completa de los operadores en
http://docs.mongodb.org/manual/reference/operator/query
Operador Mayor que ($gt)
Una consulta con el mtodo find() para los documentos cuyo array grades
contiene un documento embebido con un campo score mayor que 30 sera:
db.restaurants.find( { "grades.score": { $gt: 30 } } )
El resultado devolver solo los documentos que cumplan esta condicin.
Operador Menor que ($lt)
Una consulta con el mtodo find() para los documentos cuyo array grades
contiene un documento embebido con un campo score mayor que 10 sera:
db.restaurants.find( { "grades.score": { $lt: 10 } } )
El resultado devolver solo los documentos que cumplan esta condicin.
Condiciones Combinadas

Podemos combinar mltiples condiciones en las consultas, con la conjuncin


lgico (AND) y la disyuncin lgica (OR).

Conjuncin Lgica AND


Podemos especificar una conjuncin lgica AND para una lista de condiciones
en una consulta, separndolas por coma:
db.restaurants.find( { "cuisine": "Italian", "address.zipcode": "10075" } )
El resultado devolver solo los documentos que cumplan a la vez estas dos
condiciones.
Disyuncin Lgica OR
Podemos especificar una disyuncin lgica OR para una lista de condiciones
en una consulta, usando el operador $or:
db.restaurants.find(
{ $or: [ { "cuisine": "Italian" }, { "address.zipcode": "10075" } ] }
)
El resultado devolver los documentos que cumplan una u otra condicin, que
el campo cuisine tiene como valor Italian o el campo zipcode del documento
embebido address tiene como valor 10075.
Consultas con resultados ordenados
Para especificar un orden para los resultados obtenidos, aadimos el mtodo
sort() a la consulta. En este mtodo, se pasa un documento que contenga el
campo o campos que sirve de criterio de orden y el tipo de orden, siendo 1
para orden ascendente o -1 para orden descendente.
Por ejemplo, la siguiente operacin devuelve todos los documentos de la
coleccin restaurants ordenados primero por el campo borough en sentido
ascendente y en segundo trmino se ordena por el campo zipcode del
documento embebido address en sentido ascendente.

db.restaurants.find().sort( { "borough": 1, "address.zipcode": 1 } )


La operacin devuelve todos los documentos ordenados por los campos y el
sentido designado.

Actualizacin de Datos con la Consola Mongo.


Podemos usar el mtodo update() para actualizar documentos de una
coleccin. El mtodo acepta como parmetros:
Un filtro a travs de un documento para seleccionar los documentos a
actualizar.
Una actualizacin de documento para especificar la modificacin a llevar a
cabo y opciones de parmetros (opcional),
Para especificar el filtro de los datos a actualizar, usamos la misma estructura y
sintaxis que en las condiciones de las consultas del apartado anterior.
Por defecto, el mtodo update() actualiza un documento individual,
pudindose usar la opcin multi para actualizar todos los documentos que
cumplan el criterio de seleccin.
No es posible con este mtodo actualizar el valor del campo _id.
Actualizacin de campos especficos.
Para modificar el valor de un campo, MongoDB proporciona operadores de
actualizacin, como $set para cambiar valores. Algunos operadores de
actualizacin, como $set, crear el campo en el caso de que este no exista.
Podemos ver las referencias para cada operador individual en
http://docs.mongodb.org/manual/reference/operator/update
Actualizacin de campos de primer nivel.
La siguiente operacin actualiza el primer documento con el campo name
igual a Juni, usando el operador $set para actualizar el campo field y el

operador $currentDate para actualizar el campo lastModified con la fecha


actual.
db.restaurants.update(
{ "name" : "Juni" },
{
$set: { "cuisine": "American (New)" },
$currentDate: { "lastModified": true }
}
)
La operacin de actualizacin nos devuelve un objeto WriteResult que
contiene el status de la operacin.
Actualizar mltiples documentos.
By default, the update() method updates a single document. To update
multiple documents, use the multi option in the update() method. The
following operation updates all documents that have address.zipcode field
equal to "10016" and cuisine field equal to "Other", setting the cuisine field to
"Category To Be Determined" and the lastModified field to the current date.

Traduccin Manual 3.2. Mongo DB

Operaciones MongoDB CRUD


MongoDB proprociona una amplia variedad de sentencias para la lectura y
manipulacin de datos. Las siglas CRUD responden a las siglas en ingls para
crear, leer, actualizar y borrar. Estos trminos son la base principal de todas las
interacciones con esta base de datos.
Introduccin a las Operaciones CRUD en MongoDB
MongoDB almacena datos en un formato de Documentos, similares al formato
JSON, en los cuales los datos se almacenan como pares clave-valor. Los
Documentos son similares a estructuras en otros lenguajes de programacin
que asocian claves (campos) con valor (por ejemplo diccionarios, funciones
hash, mapas y arrays asociativos). En estricto sentido, los Documentos en
Mongo DB tienen un formato BSON, representacin binaria de JSON con
tipos de informacin adicional. En los documentos, el valor de cada campo
puede ser cualquier dato en formato BSON, incluyendo otros documentos,
arrays y arrays de documentos.

Ejemplo de documento en formato BSON, el primer y tercer par clave-valor


tiene como dato un string, el segundo un entero, y el cuarto un array de
strings.

MongoDB almacena los Documentos en Colecciones. Una Coleccin sera por


tanto un grupo de Documentos relacionados entre si, que tienen criterios de
indexacin comunes. Las Colecciones son similares, con diferencias, a las
Tablas en las bases de datos relacionales.

Esquema de una Coleccin


Operaciones en la Base de Datos.
La forma de realizar operaciones en MongoDB es mediante Consultas
(Queries) o mtodos. La sintaxis de estas Queries comienzan especificando los
criterios (o condiciones) para identificar los documentos que MongoDB
devolver al cliente, y tambin puede incluir proyecciones que incluyan los

campos de los cuales queremos devolver valores, as como modificadores para


incluir limites, exclusiones y criterios de orden a la hora de devolver los datos.
En el siguiente ejemplo se puede comprobar el criterio definido para
seleccionar un documento as como un modificador de orden.

Modificacin de Datos.
La modificacin de datos consiste en las operaciones CRUD, crear, leer,
actualizar o borrar datos por sus siglas en ingls. En MongoDB, estas
operaciones modifican los datos de forma individual en cada Coleccin. Para
las operaciones de actualizacin o borrado de datos, se especificarn los
criterios para seleccionar los documentos a tratar. En el siguiente diagrama se
detalla un ejemplo con la operacin de escritura insert, que aade un nuevo
documento a una coleccin llamada users.

Operaciones de Lectura
Las operaciones de Lectura o Queries, seleccionan datos almacenados en la
base de datos. En MongoDB, estas Queries seleccionan Documentos de una
Coleccin individual.
Las Queries, especifican los criterios y condiciones de los Documentos a
seleccionar y pueden incluir proyecciones que especifiquen los campos de los
Documentos seleccionados a devolver. De este modo, las proyecciones limitan
la cantidad de datos que MongoDB devolver al cliente que se conecte
mediante la red.

Para las operaciones de lectura, MongoDB esta provista de un mtodo con la


sintaxis db.collection.find(). Este mtodo acepta tanto criterios como
proyecciones y devuelve un cursor con los documentos seleccionados.
Opcionalmente tambin permite incluir modificadores para imponer lmites,
exclusiones y ordenes en la devolucin de los datos.

El siguiente diagrama detalla los componentes de esta operacin y


posteriormente muestra su equivalente en SQL:

Esta operacin selecciona los Documentos de la Coleccin users que


cumplen que la condicin age es mayor que 18, delimitado mediante el
operador $gt (greater than). La operacin devolver cinco documentos
seleccionados ya que el modificador limit tiene ese parmetro, con los pares
clave-valor (campos) _id, name y address que fueron indicados en la
proyeccin.
Comportamientos de las Queries.
Todas las Queries en MongoDB tienen que estar referidas a una nica
Coleccin.
Se pueden introducir lmites, exclusiones y rdenes (de impresin de datos).
El orden de devolucin de datos es indefinido a menos que se introduzca un
modificador sort().
Las operaciones para modificar documentos existentes usan la misma sintaxis
para seleccionar documentos como se ver a continuacin.
En los procesos de agregacin aggregation pipeline (para llevar a cabo
varios pasos en una misma instruccin), el operador $match proporciona
acceso a las Consultas MongoDB por pasos.
MongoDB adems proporciona un mtodo db.collection.findOne() como caso
especial del mtodo find() para devolver un slo documento, que sera el
primero en caso de no introducir ningn parmetro como criterio entre los
parntesis.

Sentencias
En el siguiente diagrama se especifica una operacin con los criterios definidos
por operadores para seleccionar Documentos de la coleccin users y con el
modificador sort() para imprimir por pantalla los resultados en orden
ascendente.

Proyecciones
Por defecto, las Queries en MongoDB devuelven todos los campos (pares
claves-valor) de todos los documentos seleccionados. Para la limitar la
cantidad de datos que MongoDB enviar a los clientes de las aplicaciones, se
incluyen proyecciones en las Queries lo que reduce los requerimientos de
procesamiento de datos de la aplicacin y de capacidad de la red de
transmisin.

En el mtodo find(), las proyecciones son el segundo argumento y especifican


entre los parntesis la lista de campos a devolver o excluir en los documentos.
Nota: Excepto para excluir el campo _id en proyecciones de inclusin, no se
pueden mezclar proyecciones de inclusin y exclusin para la seleccin de
campos.
En el siguiente ejemplo, la Query selecciona campos de la Coleccin users
con el criterio de que los documentos tienen que tener el campo age igual a

18. Seguidamente, la proyeccin especifica que slo se devolver el campo


name en los documentos seleccionados con el criterio anterior. As mismo,
dndole el valor 0 al campo _id en la proyeccin, se especifica que no se
muestre este campo.

Ejemplos de proyeccin para operaciones de Lectura.


Excluir un campo de los documentos seleccionados.
db.records.find( { "user_id": { $lt: 42 } }, { "history": 0 } )
La Query selecciona los Documentos de la Coleccin records que cumplen el
criterio de que el campo user_id sea menor que 42 mediante el operador $lt
(lower than) y usa la proyeccin para el excluir el campo history al darle a esta
el valor 0. Se puede comprobar que se usa la sintaxis de JSON para entre los
parmetros del mtodo, parntesis, incluir los documentos JSON entre llaves y
que los pares clave valor se representan mediante la clave siempre entre
comillas simples o dobles y el valor entre comillas simple o dobles si se trata
de strings.
Devolver dos campos y el campo _id de los documentos seleccionados
db.records.find( { "user_id": { $lt: 42 } }, { "name": 1, "email": 1 } )
Este ejemplo selecciona los Documentos de la Coleccin records cuyo campo
user_id tenga un valor menor de 42 y de los seleccionados solo devolver los

campos name y email. Se puede comprobar como, aunque el campo _id,


que se genera automticamente al insertar un documento como se ver ms
adelante, no ha sido incluido en la proyeccin, aparece por defecto en la
devolucin de datos.
Devolver dos campos y excluir el campo _id.
db.records.find( { "user_id": { $lt: 42} }, { "_id": 0, "name": 1 , "email": 1 } )
Este ejemplo selecciona los Documentos de la Coleccin records cuyo campo
user_id tenga un valor menor de 42 y usa la proyeccin para, aadindole el
valor 1 a los campos name y email solo devolver estos campos de los
documentos seleccionados con el criterio. Para que no devuelva el valor del
campo _id es necesario especificar el valor 0 de exclusin a ese campo,
siendo el nico caso en el que se pueden especificar inclusiones y exclusiones
en la proyeccin.
Comportamientos de las Proyecciones en MongoDB
Por defecto, el campo _id es incluido en los resultados, siendo necesario
darle el valor 0 en la proyeccin para excluirlo.
Para los documentos que contengan Arrays, MongoDB proporciona los
siguientes operadores para las proyecciones: $elemMatch, $slice, and $ (ms
el nombre del campo).
Para proyecciones relacionadas con los procesos por pasos aggregation
pipeline, se usa el operador $project.
Cursor en MongoDB
En la consola de mongo, el mtodo primario para las operaciones de lectura
es db.collection.find() , este mtodo llama a la coleccin y devuelve al cursor
los documentos seleccionados.
Para acceder a los documentos, es necesario iterar el cursor, sin embargo, en
la consola mongo, si el cursor no es asignado a una variable, automticamente
limita la iteracin a 20 documentos e imprime por pantalla los primeros 20
resultados.
Por ejemplo, en la consola de mongo, la siguiente operacin de lectura de la
coleccin inventory cuyos documentos tienen un campo type igual a food
imprime por pantalla los primeros 20 resultados de manera automtica.

db.inventory.find( { type: 'food' } )


No obstante, existen procedimientos para iterar de manera manual el cursor
superando ese lmite.
Comportamientos del Cursor
Cierre de Cursores Inactivos
Por defecto, el servidor cierra los cursores inactivos tras 10 minutos de
inactividad. Para modificar este comportamiento, se pude especificar el flag
noTimeout en la query usando el mtodo cursor.addOption(), teniendo en
cuenta que el cierre posterior ser manual. En la consola de mongo se puede
configurar el flag noTimeout de la siguiente forma.
var myCursor = db.inventory.find().addOption(DBQuery.Option.noTimeout);
Se puede ampliar informacin acerca de este flag u otros para el cursor, en la
documentacin de cada driver que se utilice para conectar las aplicaciones con
el servidor MongoD, y en la propia consola Mongo, el mtodo
cursor.addOption() proporciona una lista de los flags disponibles para el
cursor.
Cursor Aislado
As a cursor returns documents, other operations may interleave with the query.
For the MMAPv1 (page 613) storage engine, intervening write operations on a
document may result in a cursor that returns a docu- ment more than once if
that document has changed. To handle this situation, see the information on
snapshot mode (page 850).

Lotes en el Cursor
El servidor MongoDB provee los resultados de la Query por lotes, siendo el
tamao de cada lote el mximo que permite el formato BSON. Para la mayora
de la Queries, el primer lote devuelve 101 documentos o los que no excedan
de 1 megabyte, siendo el siguiente tamao de lotes de 4 megabytes. Es
posible cambiar los tamaos por defecto de los lotes con los mtodos
batchSize() y limit().

En las queries que incluyan el mtodo sort(), el servidor carga en memoria


todos los documentos, desarrollando el orden definido antes de devolver los
resultados.

Cuando el cursor itera y llega al final del lote, si hubiera mas resultados, el
mtodo cursor.next() desarrolla una operacin getmore para devolver el
siguiente lote. Para ver como cuantos Documentos permanecen en el lote se
puede usar el mtodo objsLeftInBatch() como se muestra en el siguiente
ejemplo:
var myCursor = db.inventory.find(); var myFirstDocument = myCursor.hasNext()
? myCursor.next() : null;
myCursor.objsLeftInBatch();
Informacin del Cursor.
El mtodo db.serverStatus() devuelve un Documento que incluye un campo
metrics con la siguiente informacin:
nmero de cursores time out desde el ltimo reinicio del servidor.
nmero de cursores abiertos con la opcin DBQuery.Option.noTimeout
nmero de cursores pinned abiertos.
nmero total de cursores abiertos.
En el siguiente ejemplo se llama al mtodo db.serverStatus() y al mismo
tiempo se accede al campo metrics.
db.serverStatus().metrics.cursor
Que devuelve el siguiente documento:
{
"timedOut" : <number> "open" : { "noTimeout" : <number>, "pinned" :
<number>, "total" : <number> }
}

Optimizacin de Queries
Los ndices mejoran la eficiencia de las operaciones de lectura al reducir la
cantidad de datos que las queries necesitan procesar. Esto simplifica el trabajo
asociado con al llevar a cabo las queries dentro de MongoDB.
Crear un ndice para apoyar las operaciones de lectura.
Si las aplicaciones consultan una coleccin de acuerdo a un campo concreto o
grupo de campos, un ndice por campos o compuesto evitara que la query
tenga que escanear la coleccin completa para devolver los valores
consultados. Existe una documentacin completa sobre ndices en Mongo DB.
Ejemplo
Una aplicacin consulta en la Coleccin inventory dentro del campo type. El
valor a consultar en el campo type es user-driven.
var typeValue = <someUserInput>; db.inventory.find( { type: typeValue } );
Para mejorar el desarrollo de esta consulta, se aade un ndice ascendente o
descendente para la Coleccin inventory y el campo type.
En la consola mongo, se pueden crear ndices usando el mtodo
db.collection.createIndex() :
db.inventory.createIndex( { type: 1 } )
El valor 1 asignado al campo type determina el sentido ascendente del ndice
creado con este mtodo.

Para analizar el desarrollo de una query con un ndice, se dispone de ms


informacin en el apartado Anlisis de Desarrollo de Queries. Los ndices
adems, pueden ser ms eficientes aadiendo operaciones sort. Para ms
informacin sobre este mtodo se dispone del apartado Tutoriales de
Indexizado.
Queries Selectivas.

Las queries selectivas tienen argumentos de exclusin o filtros para seleccionar


Documentos de una Coleccin y determinarn si se utilizan o no ndices. Las
queries ms selectivas, lgicamente seleccionarn un menor nmero de
documentos.
Por ejemplo, un criterio de seleccin con un valor concreto del campo _id es
tan selectivo que seleccionar documento por documento. En cambio existen
queries poco selectivas, por ejemplo las que usen los operadores $nin y $ne ya
que devolvern grandes cantidades de datos.
A veces la combinacin de estos operadores con ndices pueden dar peores
resultados que la misma query sin ndices aunque escanee todos los
Documentos de la Coleccin.
Para ms informacin, se puede ver en Expresiones Regulares.

Covered Query
Un ndice es denominado covers index para una query cuando tienen las
siguientes condiciones:
Todos los campos son partes de un ndice, y
Todos los campos devuelven sus resultados por el mismo ndice.
Por ejemplo, la Coleccin inventory tendra el siguiente ndice en los campos
type e item:
db.inventory.createIndex( { type: 1, item: 1 } )

Este ndice es cover index en la siguiente operacin con queries sobre los
campos type e item (criterio) y devuelve slo el campo item (y proyeccin):
db.inventory.find(
{ type: "food", item:/^c/ },
{ item: 1, _id: 0 }
)

Para el ndice especificado sea cover index para la query, la proyeccin debe
especificar el campo _id igual a 0 para excluirlo, ya que el ndice no incluye
este campo.
Como el ndice contiene todos los campos requeridos por la query, MongoDB
puede seleccionar ambos campos requeridos por las condiciones y devolver
los resultados solo usando el ndice.
Consultando solo el ndice, el proceso puede ser mucho ms rpido. Las claves
de los ndices son habitualmente ms pequeas que los documentos que
catalogan y los ndices estarn disponibles en la memoria RAM o
secuencialmente en el disco.
Limitaciones
Restriciones en los campos indexados.
Un ndice no puede cover index para una query si:
alguno de los campos indexados en alguno de los documentos de la
coleccin incluye un valor de tipo array. En ese caso el ndice es multi-key y no
soporta esta funcionalidad.
alguno de los campos indexados contenidos en las condiciones o proyeccin
de la query son campos pertenecientes a sub-documentos o documentos
anidados en otro documento
Por ejemplo, los siguientes documentos de la coleccin users:
{ _id: 1, user: { login: "tester" } }
en la que el valor del campo user es un documento a su vez formado por el
campo login con valor tester.

La coleccin tiene el siguiente ndice:


{ "user.login": 1 }
que no puede ser index cover por la siguiente query:

db.users.find( { "user.login": "tester" }, { "user.login": 1, _id: 0 } )


Sin embargo, la query puede usar el ndice { "user.login":1 } para encontrar
documentos seleccionados.
Restricciones en Colecciones Sharded
Un ndice no puede cover una consulta en una coleccin sharded cuando.
An index cannot cover a query on a sharded collection when run against a
mongos if the index does not contain the shard key, with the following
exception for the _id index: If a query on a sharded collection only specifies a
condition on the _id field and returns only the _id field, the _id index can cover
the query when run against a mongos even if the _id field is not the shard key.
Changed in version 3.0: In previous versions, an index cannot cover (page 68) a
query on a sharded collection when run against a mongos.

Mtodo explain.
Para determinar cuando una query es una covered query, se usa la operacin
db.collection.explain() y se revisa el resultado.
La operacin db.collection.explain() proporciona informacin dentro de la
operacin db.collection.update().
Para ms informacin se puede consultar el apartado Measure Index Use.

Operaciones de Escritura
Una operacin de escritura es cualquier operacin que crea o modifica datos
en la instancia MongoDB. En MongoDB, las operaciones de escritura afectan a
una Coleccin de manera individual. Todas las operaciones en MongoDB
estn atomizadas (en el sentido transaccin ACID todo o nada ) a nivel de un
Documento individual.
Hay tres clases de operaciones de escritura en MongoDB: insert, update y
delete. Las operaciones insert aaden nuevos Documentos a una Coleccin.
Las operaciones update modifican Documentos existentes, y las operaciones
delete borran Documentos de una Coleccin. Ninguna de estas operaciones
puede afectar a ms de un Documento de manera atomizada.
Para las operaciones de actualizacin y borrado, se pueden especificar
Criterios, o filtros, que indentifiquen los documentos a actualizar o borrar.
Estas operaciones utilizan las misma sintaxis que las Queries para las
operaciones de lectura.
MongoDB allows applications to determine the acceptable level of
acknowledgement required of write operations. See Write Concern (page 138)
for more information.
Insert
MongoDB proporciona los siguientes mtodos para insertar Documentos en
una Coleccin:
db.collection.insertOne()
db.collection.insertMany()
db.collection.insert()
insertOne nuevo en la Versin 3.2.
db.collection.insertOne() inserta un documento individual

Ejemplo
La siguiente operacin inserta un nuevo Documento en la Coleccin users. El
nuevo Documento tiene tres campos denominados name, age y status.
Aunque el Documento no especifica ningn campo _id, MongoDB aade
este campo y generando un valor para el nuevo Documento.
db.users.insertOne(
{
name: "sue",
age: 26,
status: "pending"
}
)
El siguiente diagrama describe los componentes de la operacin insertOne()
en MongoDB:

y el mismo proceso en SQL

insertMany
db.collection.insertMany() inserta varios Documentos
Ejemplo
La siguiente operacin inserta tres nuevos Documentos en la Coleccin users.
Cada Documento tiene tres campos denominados name, age y status.
Aunque el Documento no especifica ningn campo _id, MongoDB aade
este campo y generando un valor para cada nuevo Documento.
db.users.insertMany(
[
{ name: "sue", age: 26, status: "pending" },
{ name: "bob", age: 25, status: "enrolled" },
{ name: "ann", age: 28, status: "enrolled" }
]
)
El siguiente diagrama describe los componentes de la operacin insertMany()
en MongoDB:

y el mismo proceso en SQL

insert
En MongoDB, el mtodo db.collection.insert() un nuevo Documento a una
Coleccin. Puede aadir un Documento individual o un array de Documentos.
Comportamiento del mtodo insert.
El campo _id es obligatorio en cada Documento MongoDB document. The
_id field is like the documents

Si se aadiera un nuevo Documento sin el campo _id, la librera del cliente o


la instancia mongod aade un campo _id con un valor ObjectId nico. Si se
aade un campo _id con un valor que ya existe el sistema lanza una
excepcin.
El campo _id es el nico indexado por defecto en cada Coleccin.
Otros Mtodos para aadir Documentos
Las operaciones mtodos updateOne(), updateMany(), y replaceOne() aceptan
el parmetro upsert. Cuando upsert : true, si no hay documentos coincidentes,
un nuevo documento es creado conforme a la informacin pasada en la
operacin.

Update
MongoDB proporciona los siguientes mtodos para actualizar documentos en
una coleccin:
db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()
db.collection.update()

updateOne
Nuevo en la versin 3.2. db.collection.updateOne() actualiza un Documento
individual.
Ejemplo
Esta operacin de actualizacin en la ColeccinThis users collection establece
el actualizar campo status con valor reject para el primer documento
seleccionado con el filtro en el cual el campo age sea menor que 18.

db.users.updateOne( { age: { $lt: 18 } }, { $set: { status: "reject" } } )

El siguiente diagrama describe los componente de esta operacin:

y su equivalencia en SQL:

You might also like