Mongo es una base de datos noSQL con muchas características interesantes como la replicación, esquemas flexibles y alta disponibilidad transparente entre otras.
Las principales características a destacar sobre Mongo son:
- Velocidad eliminando funcionalidades(Dios los bendiga)
- Sin joins
- Sin transacciones
El equivalente MySQL -> Mongo sería:
- Colección: Tabla
- Documento: Fila
Una recomendación importante en Mongo es no repetir el valor de las key en un json:
{
"name" : "John",
"age" : 25,
"name" : "Tom",
}
Mongo utiliza una representación de los datos llamada BSON:
- Representación interna de los datos, de este modo Mongo opera internamente mas rápido.
- En disco los datos están en BSON, por red también viajan en BSON y el driver de la app finalmente lo transforma a la estructura nativa de la app, NO tiene porque pasar por JSON.
Ahora que ya tenemos una idea básica sobre Mongo procedemos con los comandos básicos y su equivalente en MySQL:
- use pcat: create database pcat
- db.runCommand( { create: “products” } ): Create table
- show dbs: show databases
- show collections: show tables
Compilamos e instalamos MongoDB::
Bindeamos el servicio a todas las ips:
bind_ip = 0.0.0.0
Accedemos a la CLI de MongoDb:
Creamos el usuario admin:
use admin
db.createUser(
{
user: "admin",
pwd: "PASSWORD",
roles: [ "root" ]
}
)
Habilitamos la autenticación:
security:
authorization: enabled
Reiniciamos el servicio:
Accedemos utilizando las credenciales:
Si queremos que haga autologin podemos especificar las credenciales en el fichero mongorc.js:
db.getSiblingDB("admin").auth("admin", "PASSWORD");
Queries:
db.products.find() -> SELECT * FROM products
NOTA: Lo bueno de Mongo es que por defecto aplica un limit a las querys, si se quieren ver los siguientes registros debemos presionar “it”, de este modo no acabremos nunca con una consola escupiendo datos de una colección(tabla) sin necesidad.
db.products.findOne() -> SELECT * FROM products limit 1
db.products.find().limit(3) -> SELECT * FROM products limit 3
db.products.count() -> SELECT COUNT(*) FROM products
Todas las queries en Mongo siguen la siguiente sintaxis:
db.products.find({FILTRO},{CAMPOS_A_MOSTRAR})
Algunos ejemplos:
db.products.find({},{name:1,brand:1}) -> SELECT name,brand FROM products
db.products.find({name:12}) -> SELECT * FROM products WHERE name=12
db.products.find({name:33},{name:1,brand:1}) -> SELECT name,brand FROM products WHERE name=33
db.products.find({price:{$gte:33}},{name:1,price:1}) -> SELECT name,price FROM products WHERE price >= 33
db.products.find({price:{$gte:33}, name:{12}},{name:1,price:1}) -> SELECT name,price FROM products WHERE price >= 33 AND name=12
db.products.find({},{name:1,brand:1}).sort({price:1}) -> Ordena por precio ascendente
db.products.find({},{name:1,brand:1}).sort({price:-1}) -> Ordena por precio descendente
NOTA: El orden de los documentos NO tiene porque ser el mismo en las DBs de los miembros de un replicaset, si queremos que el orden sea el mismo debemos ordenar.
Todos los documentos de una colección NO tienen porque tener los mismos campos, en la siguiente query consultamos los documentos donde exista un campo:
db.products.find({price: {$exist: true}}) -> SELECT * FROM products WHERE EXISTE price
El uso de cursores evita reventar el server cuando se hacen queries sin cabeza, no se sirven un millón de resultados si no que se sirven unos cuantos y utilizando el cursor se piden los siguientes, de este modo el server no explota por una query incorrecta.
var cursor = db.products.find()
cursor.next() -> Muestra los datos obtenidos de uno en uno
Algo realmente útil es la ayuda de Mongo, por ejemplo:
db.products.find().help()
Escribir db.COLECCION.COMANDO puede ser un poco tedioso, podemos hacer lo siguiente:
t = db.sample
t.find()
NOTA: Mongo tiene un límite de 16MB por documento, esto se impone para evitar que un programador almacene animaladas, además cuando se pida el documento por red solo viajarán los 16MB.
En mas de una ocasión nos hará falta importar datos desde un json, es tan sencillo como: