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":...