Operaciones con MongoDB

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en español con un tamaño de 4,39 KB

Usando aggregate

Obtener para cada TipoOcio y Empresa: el TipoOcio, la empresa, la media de los costes de sus actividades que son más populares (Nivel >= 7) y cuántas actividades hay que cumplen dicha condición. Queremos esos valores solo para los TipoOcio que tengan más de 5 actividades. Clasifica el resultado de modo descendente por TipoOcio y Empresa.

db.Ocio.aggregate

[ { $match: { 'Nivel':{$gte:7} } }, { $group: { _id: { ElTipo: '$TipoOcio', LaEmpresa: '$Empresa' }, mediaCoste: { $avg: '$Coste' }, totdocs: { $sum: 1 } } }, { $match: { 'totdocs':{$gte:5} } }, {$sort: { _id: -1}} ]

Usando solo una instrucción update

Queremos actualizar el 1º documento que cumpla las condiciones siguientes (o insertar un documento con esos datos, si no existe ninguno que cumpla las condiciones): TipoOcio: 'montañismo', Empresa: 'CabraMonteSA', Elemento: 'CaminoSchmid' y dentro de las propiedades debe estar el par : (dificultad , media ). Además, no queremos que otro proceso pueda escribir en la colección hasta terminar esta operación. Los cambios a realizar cuando se cumplen las condiciones (si no se cumplen: insertar el documento que además incluya estos datos) son: Nivel = 9, Coste = 5, y un atributo nuevo, MeGusta: sí.

db.Ocio.update

({ $and: [{TipoOcio: 'montañismo'}, {Empresa: 'CabraMonteSA'}, {Elemento: 'CaminoSchmid'}, {Propiedades: {$elemMatch: {('dificultad' : 'media')}}}], $isolated:1}, /* otro proceso no escribe hasta terminar */ $set: { Nivel: 9, Coste: 5, MeGusta: 'sí' }, { upsert: true }, false )

Usando solo una instrucción find

con la función forEach que recorra la colección: queremos actualizar solo aquellas actividades cuyo TipoOcio es alguno de estos: 'montañismo', 'rafting', 'piragua', 'piano'. La actualización consiste en bajar el coste proporcionalmente, de aquellas actividades que tienen el nivel bajo (<5): - Si el coste es menor de 1000 aplicamos esta fórmula (10 - (5 – nivel) /10) * coste. Además, añadimos el atributo: Oferta = 'regular'. - Si el coste es mayor o igual a 1000 aplicamos (8 - (5 – nivel) /10) * coste; Además, añadimos el atributo: Oferta = 'buena'.

db.Ocio.find

({TipoOcio: {$and [ { Nivel: {$lt : 5}, {$in: ['montañismo', 'rafting', 'piragua', 'piano'] }] }).forEach( function (myDoc) { if (myDoc.Coste < 1000 ){ myDoc.Coste = ((10 - (5 - myDoc.Nivel)) / 10) * myDoc.Coste; myDoc. Oferta = 'regular'; } else { myDoc.Coste = ((8 -(5 - myDoc.Nivel)) /10) * myDoc.Coste; myDoc. Oferta = 'buena'; } print(myDoc); /* para ver lo que modifica */ db.Ocio.save(myDoc); /* también se puede con update */ });

Tenemos creada una colección llamada Peliculas

dentro de mi base de datos llamada cosasDeCine, cuyos documentos tienen los siguientes campos: Genero (de la película). Director (uno por peli). Título. Valoración (de 0 a 10), Coste, NombresPersonajes (un array)

Usando una sola instrucción find

obtener las películas con valoración entre 4 y 8 ambos incluidos, y el número de NombresPersonajes sea 3. Al resultado del find, para cada película encontrada, aplicar una función sin nombre que imprima en una línea inluyendo el nombre del campo y su valor los siguientes: el Género, el Título y la valoración relativa (se calcula con la Valoración multiplicada por el Coste).

SOLUCION : db.getCollection('Peliculas').find( { $and : [ {Valoración : {$gte : 4}}, {Valoración : {$lte : 8}}, {NombresPersonajes : {$size:3}} ] }).forEach(function(doc){ print('Género: ' + doc.Género + ' Título: ' + doc.Título + ' -- Val.Rel.: ' + (doc.Valoración * doc.Coste)); });

Usando una sola instrucción aggregate

queremos acumular lo siguiente para las películas con el mismo Género y Valoración (aunque sólo para aquellas películas con Valoración igual o mayor de 5): - Un campo con la suma total de todos sus Costes - Otro campo con la cantidad de dichas películas - Otro campo con el Director y el Título de cada una de dichas películas Después, en la misma instrucción aggregate, queremos clasificar el resultado por Género, de modo descendente.

db.Peliculas.aggregate

[ { $match: { 'Valoración':{$gte:5} } }, { $group: { _id: {Género:'$Género', Valoración:'$Valoración' }, total: { $sum: '$Coste' }, count: { $sum: 1 }, lasPelis: {$addToSet:{ElDirector: '$Director', Nombre: '$Nombre'}} } }, {$sort: { '_id.Género':-1}} ]

Entradas relacionadas: