Ejercicios
Introducción
Sea salas, la colección construida, como sigue:
db.salas.insertMany([
{
"_id": 1
"nombre": "AJMI Jazz Club",
"dirección": {
"número": 4
"calle": "Rue des Escaliers Sainte-Anne",
"códigoPostal": "84000",
"ciudad": "Aviñón",
"ubicación": {
"type": "Point",
"coordinates": [43.951616, 4.808657]
}
},
"estilos": ["jazz", "soul", "funk", "blues"],
"opinión": [{
"fecha": new Date('2024-11-01'),
"nota": NúmeroInt(8)...
Suprimir, insertar y actualizar documentos
Ejercicio 1
Mostrar el identificador y el nombre de las salas que sean SMAC (del francés Sala de Música Actual).
Ejercicio 2
Mostrar los nombres de las salas con un aforo de poco más de 1000 plazas.
Ejercicio 3
Mostrar los identificadores de las salas cuyo campo dirección no contenga un número.
Ejercicio 4
Mostrar el identificador y, a continuación, el nombre de las salas que tengan exactamente una opinión.
Ejercicio 5
Mostrar todos los estilos musicales de salas que programen blues en particular.
Ejercicio 6
Mostrar todos los estilos musicales de salas que tengan el estilo «blues» en primera posición en su tabla de estilos.
Ejercicio 7
Mostrar las ciudades de las salas cuyo código postal comience por 84 y cuyo aforo sea estrictamente inferior a 500 plazas (recuerde utilizar una expresión regular).
Ejercicio 8
Mostrar el ID para las salas en las que el ID sea par o falte el campo opinión.
Ejercicio 9
Mostrar los nombres de las salas en las que al menos una de las opiniones tenga una nota entre 8 y 10 (ambas incluidas).
Ejercicio 10
Mostrar los nombres de las salas en las que al menos una opinión tenga una fecha posterior al 15/11/2024 (recuerde utilizar el tipo Date de JavaScript).
Ejercicio 11
Mostrar el nombre y el aforo de las salas en las que el producto del valor del identificador multiplicado por 100 sea estrictamente superior al aforo....
Validar documentos
Ejercicio 1
Modificar la colección salas para que los documentos que se inserten en ella se validen a partir de ahora; esta validación se realizará en modo «strict» y abarcará los siguientes campos:
-
nombre es obligatorio y debe ser una cadena de caracteres.
-
El aforo es obligatorio y debe ser de tipo entero (int).
-
En el campo dirección, los campos códigoPostal y localidad, ambos de tipo cadena de caracteres, son obligatorios.
¿Qué se constata la próxima vez que se intente la siguiente inserción y por qué?
db.salas.insertOne(
{"nombre": "Super room", "aforo": 1500, "dirección": {"ciudad":
"Musiqueville"}}
)
¿Qué propone usted para regularizar la situación?
Ejercicio 2
Añadir un criterio adicional a los criterios de validación existentes: el campo _id debe ser ahora de tipo entero (int) u ObjectId.
¿Qué ocurre si se intentan actualizar todos los documentos existentes en la colección mediante la siguiente consulta?
db.salas.updateMany({}, {$set: {"verificado": true}})
Eliminar los criterios añadidos utilizando el método delete de JavaScript.
Ejercicio 3
Añadir el siguiente criterio a los criterios de validación existentes:
El campo smac debe...
Índices
Ejercicio 1
Una revisión rápida de los archivos de registro reveló que la mayoría de las consultas a la colección salas se dirigen tanto al aforo como a códigos postales, como se indica a continuación:
db.salas.find({"aforo": {$gt: 500}, "dirección.códigoPostal": /^30/})
db.salas.find({"dirección.códigoPostal": /^30/, "aforo": {$lte: 400}})
¿Qué índice propone usted para cubrir estas consultas?
A continuación, eliminar el índice que se ha creado.
Ejercicio 2
Se desea buscar nombres de calles en las direcciones de esta forma:
db.salas.find({$texto: {$búsqueda: "camino"}})
¿Qué tipo de índice recomienda?
Ejercicio 3
Se desearía poder ejecutar este tipo de consulta que devuelve documentos en orden ascendente de distancia desde un punto determinado, ¿qué tipo de índice habrá que crear?
db.salas.find(
{
"ubicación": {
$esferaCercana: {
"type" : "Point",
"coordinates" : [ 43.923005, 5.020077...
Consultas geoespaciales
Ejercicio 1
Se cuenta con el siguiente código JavaScript, que incluye una función para convertir una distancia expresada en kilómetros a radianes, y un documento cuyas coordenadas servirán como centro de la esfera de búsqueda. Escribir una consulta $geoWithin para mostrar los nombres de los locales que toquen Blues y Soul en un radio de 60 kilómetros.
KilómetrosEnRadianes = function(kilómetros){
radioTerrestreEnKm = 6371
return kilómetros / radioTerrestreEnKm
};
sala = db.salas.findOne({"dirección.ciudad": "Nimes"})
consulta = { ... };
db.salas.find(consulta ... };
Ejercicio 2
Escribir la consulta para obtener las ciudades de las salas situadas en un radio de 100 kilómetros alrededor de Marsella, ordenadas de la más cercana a la más lejana:
marsella = {"type": "Point", "coordinates":[43.300000,
5.400000]}
db.salas.find(...)
Ejercicio 3
Sea polígono un objeto GeoJSON de la siguiente forma:
polígono = {
"type": "Polygon
"coordinates": [
[
[43.94899, 4.80908]...
Marco de trabajo de agregación
Ejercicio 1
Escribir el pipeline que mostrará, en un campo llamado ciudad, el nombre de la ciudad con una sala para más de 50 personas y un booleano llamado grande que se establecerá en el valor «true» cuando la sala tenga un aforo de más de 1.000 personas. Este es el esqueleto de código que se utilizará en el shell:
pipeline = [
...
]
db.salas.aggregate(pipeline)
Ejercicio 2
Escribir el pipeline que muestre el aforo de una sala aumentada en 100 plazas en un campo llamado después_ampliación, así como su aforo y nombre originales en un campo llamado antes_ampliación.
Ejercicio 3
Escribir el pipeline que muestre, por número de departamento, el aforo total de las salas de ese departamento. Para obtener este número, es necesario utilizar el operador $substrBytes, cuya sintaxis es la siguiente:
{$substrBytes: [ < cadena de caracteres >, < índice inicial >,
< longitud > ]}
Ejercicio 4
Escribir el pipeline que muestre, para cada estilo musical, el número de salas que lo programan. Estos estilos se enumerarán por orden alfabético.
Ejercicio 5
Con la ayuda de los bukets (contenedor) contar las salas según su aforo:
-
de 100 a 500 plazas
-
de 500 a 5000 plazas
Ejercicio 6
Escribir un pipeline que muestre el nombre de las salas y una matriz llamada opinion_excelente...