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);
  }
});

Entradas relacionadas: