¡Hasta -30% en todos los libros en línea,
eformaciones y vídeos*! Código: NEURONA30 Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros y videos
  2. MongoDB
  3. Respuestas a los ejercicios
Extrait - MongoDB Comprensión y optimización de la gestión de datos (con ejercicios y soluciones)
Extractos del libro
MongoDB Comprensión y optimización de la gestión de datos (con ejercicios y soluciones) Volver a la página de compra del libro

Respuestas a los ejercicios

Suprimir, insertar y actualizar documentos

Ejercicio 1

db.salas.find({"smac": true}, {"nombre": 1}) 

Ejercicio 2

db.salas.find({"aforo": {$gt: 1000}}, {"_id": 0, "nombre": 1}) 

Ejercicio 3

db.salas.find({"dirección.número": {$exists: false}}, {"_id": 1}) 

Ejercicio 4

db.salas.find({"opinión": {$aforo: 1}}, {"_id": 1, "nombre": 1}) 

o

db.salas.find({"opinión": {$aforo: 1}}, {"nombre": 1}) 

Ejercicio 5

db.salas.find({"estilos": "blues"}, {"_id": 0, "estilos": 1}) 

Ejercicio 6

db.salas.find({"estilos.0": "blues"}, {"_id": 0, "estilos": 1}) 

Ejercicio 7

db.salas.find({  
   $y: [{  
       "dirección.códigopostal": /^84/,  
       "aforo": {$lt: 500}  
   }]  
}, {  
   "_id": 0  
   "dirección.ciudad": 1  
}) 

o, más sencillo:

db.salas.find({  
   "dirección.códigopostal": /^84/,  
   "aforo": {$lt: 500}  
}, {  
   "_id":...

Validar documentos

Ejercicio 1

Este es un posible comando para crear una validación para las salas:

db.runCommand( {  
  collMod: "salas",  
  validador: { $jsonSchema: {  
     bsonType: "object",  
     required: [ "nombre", "aforo", "dirección.códigopostal",  
"dirección.ciudad"],  
     properties: {  
        "nombre": {  
           bsonType: "string",  
           description: "Cadena de caracteres - requerido"  
        },  
        "aforo": {  
           bsonType: "int",  
           description: "Entero - requerido"  
        },  
        "dirección.códigoPostal": {  
           bsonType: "string",  
           description: "Cadena de caracteres - requerido"  
        },  
       "dirección.ciudad": {  ...

Índices

Ejercicio 1

El siguiente índice cubrirá nuestras consultas más frecuentes:

db.salas.createIndex({ "aforo": 1, "dirección.códigoPostal": 1 }) 

Un explain aplicado a nuestras consultas muestra que el collscan que se realizaba antes de configurar el índice ha desaparecido en favor de nuestro índice, cuyo nombre predefinido es aforo_1_dirección.códigoPostal_1.

Este índice también puede abarcar las siguientes clasificaciones:

db.salas.find({}).sort({"aforo": 1})  
db.salas.find({}).sort({"aforo": 1, "dirección.códigoPostal": 1 }) 

Para destruir nuestro índice, basta con ejecutar:

db.salas.dropIndex("aforo_1_dirección.códigoPostal_1") 

Ejercicio 2

No hay lugar a dudas: ¡la solución es crear un índice textual! Hay que señalar que el idioma utilizado en nuestra colección es el español:

db.salas.createIndex({"dirección.calle": "text"},  
{"default_language": "spanish"}) 

Ejercicio 3

Tendremos que crear un índice 2dsphere para gestionar esta consulta geoespacial:

db.salas.createIndex({"localisation": "2dsphere"}) 

Si no lo hacemos, la solicitud producirá un error.

Ejercicio 4

Nuestro índice parcial...

Consultas geoespaciales

Ejercicio 1

Aquí está el código completo de nuestra consulta con las partes que faltan en negrita; hay que recordar que $geoWithin no ordena de ninguna manera los documentos que devuelve:

KilómetrosEnRadianes = function(kilómetros){  
   var radioTierraEnKm = 6371;  
   return kilómetros / radioTierraEnKm;  
}  
 
sala = db.salas.findOne({"dirección.ciudad": "Nimes"});  
 
consulta =  
   "dirección.ubicación" : {  
       $geoDentro : {  
           $centroEsfera : [  
                  sala.dirección.ubicación.coordinates,  
                  KilómetrosEnRadianes(60)  
           ]  
       }  
   },  
   "estilos": {$in: ["blues", "soul"] 
}  
db.salas.find(query, {"_id": 0, "nombre": 1}) 

Ejercicio 2

¡La noción de clasificación debería ponernos sobre la pista de $nearSphere!

marsella = {" type": "Point", "coordinates":[43.300000,  
5.400000]}...

Marco de trabajo de agregación

Ejercicio 1

pipeline = [{  
       $match: {"aforo": {$gt: 50}},  
   }, {  
       $project: {  
           "_id": 0   
           "ciudad": "$dirección.ciudad",   
           "grande": {$gte: ["$aforo", 1000 ]}  
       }  
   }  
]  
 
db.salas.aggregate(pipeline) 

Ejercicio 2

El campo después_ampliación hará uso del operador $addFields; en esta parte, describiremos la adición requerida, usando $add:

pipeline = [{  
       $match: {"direccion.codigopostal": /^84/},  
   }, {  
       $addFields: {  
           "después_ampliación": { $add: [ "$aforo", 100] }  
       }  
   }, {  
       $project: {  
           "_id": 0   
           "nombre": 1,   
           "antes_ampliación":...