Professional Documents
Culture Documents
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
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.
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
"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"
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
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.
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.
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.
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().
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.
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.
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:
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:
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
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.
y su equivalencia en SQL: