Saltar al contenido

Consultar cada modelo

Las operaciones básicas de MongoDB, los tipos de dato y comandos de Redis, y una primera lectura de CQL en Cassandra y de Cypher en Neo4j.

Escribir y borrar en MongoDB

En la consola de MongoDB toda operación se escribe con la misma forma de tres piezas: el objeto que representa la base de datos, el nombre de la colección y el método que se aplica. En db.cursos.insertOne, db es la base activa, cursos es la colección y insertOne es el método.

No hay que crear la colección antes de usarla. Si se escribe en una colección que no existe, el motor la crea en ese momento con la primera inserción, coherentemente con la idea de que no hay esquema que declarar.

javascript
// Insertar un documento. Si la colección no existe, se crea aquí.
db.cursos.insertOne({ titulo: 'TAI Curso Largo', horas: 300, activo: true })

// Modificar el primer documento que cumpla el filtro.
db.cursos.updateOne({ titulo: 'TAI Curso Largo' }, { $set: { activo: false } })

// Borrar todos los que cumplan el filtro.
db.cursos.deleteMany({ activo: false })

Los métodos van en parejas de uno y muchos: insertOne e insertMany, updateOne y updateMany, deleteOne y deleteMany. La diferencia no es cosmética: updateOne modifica solo el primer documento que encaja con el filtro, aunque encajen mil.

Para modificar hay que usar un operador como $set. Si se pasa el objeto sin operador, se reemplaza el documento entero y desaparecen los campos que no se hayan repetido.

Para el examen

  • Forma de las órdenes: db.coleccion.metodo

  • Parejas de métodos: One y Many: insertOne, updateMany…

  • Creación de la colección: se crea sola al insertar el primer documento

  • Modificar: exige un operador como $set

Consultar en MongoDB: filtro, proyección y cursor

El método de lectura es find, y admite dos argumentos con papeles muy distintos, que es donde más se falla.

  • El primer argumento es el filtro: qué documentos se quieren. Decide cuántos resultados salen.
  • El segundo argumento es la proyección: qué campos de cada documento se quieren. Decide qué ancho tiene cada resultado, no cuántos hay. Se marca con 1 el campo que se incluye y con 0 el que se excluye.

Las comparaciones que no son de igualdad se escriben con operadores que empiezan por dólar: $gt (mayor que), $gte (mayor o igual), $lt y $lte para las contrarias, $ne (distinto) y $in (que esté en una lista).

Y find no devuelve la lista de resultados, devuelve un cursor: un puntero desde el que se van pidiendo los documentos poco a poco. Por eso se le pueden encadenar métodos como sort para ordenar o limit para cortar el número de resultados, y por eso una consulta sobre millones de documentos no se trae la base entera a memoria.

javascript
db.cursos.find(
  { horas: { $gte: 200 } },        // filtro: qué documentos
  { titulo: 1, horas: 1, _id: 0 }  // proyección: qué campos
)
.sort({ horas: -1 })               // el cursor admite encadenar
.limit(5)

Filtro y proyección responden a preguntas distintas: cuáles y qué campos. El cursor es lo que permite ordenar y limitar sin traerse todo.

Para el examen

  • Primer argumento de find: el filtro: qué documentos

  • Segundo argumento: la proyección: qué campos

  • Qué devuelve: un cursor, al que se encadenan sort y limit

  • Operadores de comparación: $gt, $gte, $lt, $lte, $ne e $in

Redis: un comando distinto por cada tipo de dato

En Redis la clave no guarda un valor cualquiera, sino un valor de un tipo concreto, y cada tipo trae sus propias operaciones. Saber a qué tipo pertenece cada comando es lo que se pregunta, y hay una pista buena: la inicial del comando suele delatar el tipo.

TipoPara qué se usaComandos característicos
Cadenas (strings)Valores sueltos: una sesión, un contador, un fragmento en cachéSET, GET
Listas (lists)Secuencias con orden: colas de trabajo, últimos avisosLPUSH, LRANGE
Conjuntos (sets)Pertenencia sin repetidos: etiquetas, temas pendientes de repasoSADD, SMEMBERS
HashesObjetos con campos: un registro con varios atributos bajo una sola claveHSET, HGET, HMSET, HMGET, HGETALL
redis
SET sesion:8421 activa
GET sesion:8421

LPUSH avisos:8421 "Nuevo simulacro publicado"
LRANGE avisos:8421 0 9

SADD temas-repaso:8421 5 12 27
SMEMBERS temas-repaso:8421

HSET alumno:8421 nombre Ana curso largo
HGET alumno:8421 curso
HGETALL alumno:8421

La L de LPUSH y LRANGE es de lista, la S de SADD y SMEMBERS es de set, y la H de HSET, HGET y HGETALL es de hash. Con esa regla se acierta casi cualquier pregunta de comandos de Redis.

Para el examen

  • Cadenas: SET y GET

  • Listas: LPUSH y LRANGE

  • Conjuntos: SADD y SMEMBERS

  • Hashes: HSET, HGET y HGETALL

CQL en Cassandra y Cypher en Neo4j

Los otros dos modelos tienen lenguajes propios que conviene reconocer de vista, aunque no haya que escribirlos de memoria.

Cassandra usa CQL, cuya sintaxis se parece deliberadamente a SQL para bajar la barrera de entrada. El parecido es solo de forma: no hay uniones entre tablas ni subconsultas, y la clave primaria manda mucho más que en SQL, porque su primera parte decide en qué nodo vive la fila y el resto decide cómo quedan ordenadas las columnas dentro de ella.

sql
CREATE TABLE academia.intentos (
  alumno   uuid,
  fecha    timestamp,
  tema     int,
  aciertos int,
  PRIMARY KEY (alumno, fecha)
);

-- La consulta natural: todo lo de un alumno, que vive en un solo nodo.
SELECT tema, aciertos FROM academia.intentos
WHERE alumno = 8f2c1a94-0000-0000-0000-000000000000
  AND fecha > '2026-01-01';

Neo4j usa Cypher, que no se parece a SQL en nada: se escribe dibujando el patrón que se busca. Los paréntesis son nodos, los corchetes entre flechas son relaciones, y la consulta consiste en describir la forma del trozo de grafo que interesa y dejar que el motor lo encuentre.

cypher
MATCH (a:Alumno)-[:FALLA]->(t:Tema)<-[:FALLA]-(companero:Alumno)
WHERE a.id = 8421
RETURN companero.nombre, count(t) AS temas_en_comun
ORDER BY temas_en_comun DESC
LIMIT 5

CQL se parece a SQL pero no hace uniones. Cypher no se parece a SQL porque describe un patrón de nodos y relaciones en lugar de un conjunto de filas.

Para el examen

  • CQL (Cassandra): imita a SQL, pero sin uniones ni subconsultas

  • Cypher (Neo4j): describe patrones

  • Sintaxis de Cypher: paréntesis para nodos y corchetes con flechas para relaciones