Operaciones Esenciales en MongoDB: Consultas y Manipulación de Datos
Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 6,57 KB
Este documento presenta una serie de ejemplos prácticos para interactuar con colecciones en MongoDB, abarcando desde consultas básicas hasta operaciones de agregación complejas y manipulación de documentos. Cada sección incluye el comando de MongoDB Shell correspondiente, optimizado para una mejor comprensión y aplicación.
1. Consultas Básicas y Proyecciones
1.1. Obtener Temas Disponibles en la Colección aficiones
Esta consulta devuelve una lista de todos los valores únicos presentes en el campo Tema
de la colección aficiones
.
db.aficiones.distinct("Tema")
1.2. Identificar Componentes Mejor Valorados (Puntuación Igual o Superior a 9)
Permite encontrar y proyectar solo el campo Nombre
de aquellos componentes cuya Puntuacion
es 9 o superior, excluyendo el _id
por defecto.
db.aficiones.find({"Puntuacion" :{$gte: 9}},{"Nombre":1,_id:0});
2. Agregaciones para Cálculos y Resúmenes
2.1. Calcular Gasto Total por Tema en Componentes Mejor Valorados (Puntuación Igual o Superior a 9)
Esta operación de agregación filtra los componentes con una Puntuacion
de 9 o más, los agrupa por Tema
, calcula la suma total de sus Precio
y el conteo de componentes por tema, y finalmente ordena los resultados por Tema
de forma ascendente.
db.aficiones.aggregate([
{ $match: { "Puntuacion": { $gte: 9 } } },
{ $group: { _id: "$Tema", total: { $sum: "$Precio" }, count: { $sum: 1 } } },
{ $sort: { _id: 1 } }
]);
2.2. Sumar Precio Total de Componentes con Puntuación Superior a 9
Calcula el costo total de todos los componentes que tienen una Puntuacion
estrictamente mayor que 9, sin agrupar por tema.
db.aficiones.aggregate([
{ $match : { "Puntuacion": { $gt: 9 } } },
{ $group: { _id: null, PrecioTotal : { $sum : "$Precio" } } }
]);
2.3. Agrupar Componentes por Nivel de Valoración (10, 9, 8, 7, 6)
Esta agregación filtra los componentes por puntuaciones específicas (10, 9, 8, 7, 6) y luego los agrupa por su Puntuacion
, listando los Tema
asociados a cada nivel de valoración.
db.aficiones.aggregate([
{ $match : { $or : [
{ Puntuacion : { $eq : 10 } },
{ Puntuacion : { $eq : 9 } },
{ Puntuacion : { $eq : 8 } },
{ Puntuacion : { $eq : 7 } },
{ Puntuacion : { $eq : 6 } }
] } },
{ $group : { _id : "$Puntuacion", componente : { $push : "$Tema" } } }
]);
2.4. Listar Apodos Asociados a Cada Afición
Agrupa los documentos por Tema
y crea un conjunto único de Apodos
para cada tema, evitando duplicados.
db.aficiones.aggregate([
{ $group : { _id : "$Tema", Apodos: { $addToSet : "$Apodo" } } }
]);
2.5. Obtener Nombres de Componentes Clasificados por Tema
Esta agregación organiza los nombres de los componentes por su Tema
, mostrando también el conteo de componentes por tema. El resultado se itera y se imprime en la consola.
db.aficiones.aggregate({
$group: {
_id: { tema: "$Tema" },
count: { $sum: 1 },
docs: { $push:"$Nombre" }
}
}).forEach( function(myDoc) { print(myDoc); });
3. Actualización y Manipulación Avanzada de Documentos
3.1. Aplicar Descuento y Añadir Atributo de Descuento Condicional
Este script itera sobre cada documento en la colección aficiones
. Si la Puntuacion
es menor que 7, aplica un descuento del 10% al Precio
. Además, añade o actualiza un atributo Descuento
que representa el porcentaje de la puntuación sobre 10, para todas las aficiones.
db.aficiones.find().forEach( function (myDoc) {
var descuento = myDoc.Precio * 0.10;
var porcentaje = (myDoc.Puntuacion / 10) * 10;
if (myDoc.Puntuacion < 7 ) {
myDoc.Precio = myDoc.Precio - descuento;
}
myDoc.Descuento = porcentaje;
db.aficiones.save(myDoc);
});
4. Gestión de Colecciones y Operaciones CRUD Adicionales
4.1. Creación de una Colección Capped
Ejemplo de cómo crear una colección con propiedades capped, limitando su tamaño y el número máximo de documentos.
db.createCollection("name", { capped: true, size: 1000, max: 5, autoIndexId: true });
4.2. Ejemplo de Operación update
con Opciones
Demostración de la sintaxis para actualizar documentos, incluyendo el uso de $isolated
, $set
, y las opciones upsert
y multi
.
db.misMensajes.update(
{ _id : myId, $isolated: 1 },
{ $set :{ puntos : 8, propiedades : [ { /* ... */ } ] } },
{ upsert: true, multi: true }
);
upsert: true
: Si no se encuentra un documento que coincida con el filtro, se inserta uno nuevo.multi: true
: Actualiza todos los documentos que coincidan con el filtro, en lugar de solo el primero.
4.3. Búsqueda de Documentos por Rango de Edad de Destinatarios
Encuentra documentos en la colección misMensajes
donde la edad
de los destinatarios
se encuentra entre 15 (exclusivo) y 18 (exclusivo). Proyecta solo el campo nombre
y excluye el _id
.
db.misMensajes.find(
{ "destinatarios.edad" : { $gt: 15, $lt : 18 } },
{ nombre: 1, _id : 0 }
);
4.4. Inserción de un Nuevo Documento con Array de Destinatarios
Ejemplo de cómo insertar un nuevo documento en la colección misMensajes
, incluyendo un array de objetos para el campo destinatarios
.
db.misMensajes.insert({
"fecha" : "22-6-17",
"texto" : "bla",
"destinatarios": [
{ "nombre" : "pepe", "apodo" : "opa" },
{ "nombre" : "luis", "apodo" : "pru" }
]
});
4.5. Iteración y Visualización de Mensajes y Destinatarios
Este script recupera todos los documentos de la colección misMensajes
, itera sobre ellos y muestra el texto
de cada mensaje, seguido de los nombre
de sus destinatarios
.
var Cursor = db.misMensajes.find();
Cursor.forEach(function(k){
print("Texto del mensaje: " + k.texto + '\n');
print("Destinatarios: ");
for(var i = 0; i < k.destinatarios.length; i++) {
print("Nombre: " + k.destinatarios[i].nombre);
}
});