Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Actividad 2:
Laboratorio - Uso de
MongoDB
TABLA DE CONTENIDO
2. Exploración de Colecciones
db.books.findOne()
De igual manera con el comando findOne se exploran los campos de la colección companies. El
documento mostrado tiene 36 campos, de los cuales varios son de tipo array.
Se valida si existen documentos duplicados en la colección books, tomando como base los campos
title e isbn, que son características únicas de los libros y el campo status. Para ello se usa
agregación y el resultado muestra 2 documentos repetidos. Si no cumplen esta condición se
consideran libros distintos ya que si el isbn es diferente puede tratarse de otro formato del libro.
db.books.aggregate([
{$group: {
_id: {title: "$title"},
uniqueIds: {$addToSet: "$_id"}, authors: {$addToSet: "$authors"},
pageCount: {$addToSet: "$pageCount"},
count: {$sum: 1}}},
{$match: {
count: {$gt: 1}
}
}
]);
A partir de la consulta anterior, se ejecuta la consulta para eliminar uno de los dos documentos
repetidos usando la instrucción forEach de JavaScript.
db.books.aggregate([
{$group: {_id: {title: "$title",isbn:"$isbn",status:"$status"},
dups: {$addToSet: "$_id"}, pageCount: {$addToSet: "$pageCount"},
count: {$sum: 1}}},
{$match: {count: {$gt: 1}}}
]).forEach(function(doc){
doc.dups.shift();
db.books.remove({_id:{$in: doc.dups}
})
})
Al igual que en la colección books en la colección companies existen registros que se podrían
considerar duplicados si tuvieran todos los campos iguales. Se realiza la consulta por el campo
name, encontrando 907 registros.
db.companies.aggregate([
{$group: {_id: {name: "$name"}, count: {$sum: 1}}},
{$match: {count: {$gt: 1}}},
{$count: "name"}
])
Previo a realizar una limpieza se realiza una nueva evaluación pero incluyendo los campos más
relevantes para considerar documentos duplicados. Se obtiene el mismo número de documentos
(907).
db.companies.aggregate([
{$group: {_id: {name: "$name", category_code:"$category_code",
number_of_employees:"$number_of_employees",
tag_list:"$tag_list", email_address:"$email_address",
acquisition:"$acquisition", offices:"$offices",
founded_year:"$founded_year", homepage_url:"$homepage_url"},
count: {$sum: 1}}},
{$match: {count: {$gt: 1}}},
{$count: "name"}
])
Por lo antes expuesto se modifica la consulta anterior para eliminar las compañías duplicadas.
db.companies.aggregate([
{$group: {_id: {name: "$name", category_code:"$category_code",
number_of_employees:"$number_of_employees",
tag_list:"$tag_list", email_address:"$email_address",
acquisition:"$acquisition", offices:"$offices",
founded_year:"$founded_year", homepage_url:"$homepage_url"},
count: {$sum: 1},dups:{$addToSet:"$_id"}}},
{$match: {count: {$gt: 1}}},
]).forEach(function(doc){
doc.dups.shift();
db.companies.remove({
_id:{$in: doc.dups}
})
})
db.books.distinct("categories")
db.books.distinct("status")
d. Utiliza la condición de la consulta anterior para recuperar aquellos libros que posean
exactamente 2 autores y que estén publicados. Muestra solo los campos: title,
longDescription, status y authors.
Tomando la condición anterior se añade el filtro solicitado al comando find para ajustarlo a
las condiciones planteadas.
Figura 14. Resultado de la consulta que muestra libros publicados con 2 autores
Figura 15. Resultado de la consulta que muestra libros publicados con 2 autores sin .pretty()
e. Describe brevemente qué ocurre si a la consulta del punto anterior, le añades al final la
siguiente instrucción: .toArray()
La función muestra la colección como un array y esto hace que también se muestre de forma
ordenada, similar al método pretty(). Sin embargo, la ventaja de esta instrucción es que el
resultado podría asignarse a una variable.
Al añadir el ultimo código se usa la instrucción forEach de JavaScript para recorrer los
campos de cada documento (elemento) del array y concatenarlos en una cadena de todos los
campos consultados con sus respectivas etiquetas. Esto podría ser útil para presentar los
datos de una forma más clara al usuario.
3. Consultas de la colección 1
db.books.dataSize()
La base de datos tiene 429 libros de los cuales son únicos 427. Dos libros tienen el mismo
nombre, pero distinto isbn.
db.books.count()
db.books.distinct("title").length
db.books.find({pageCount:{$gte:200}}).count()
Figura 21. Consulta que devuelve los libros con 200 o más páginas
db.books.find({pageCount:{$gte:300,$lte:600}}).count()
Figura 22. Consulta de devuelve los libros que tienen entre 300 y 600 páginas
db.books.aggregate([
{$facet: {
result1: [
{$match: {pageCount:{$eq:0}}},
{$count:"ZeroPages"},
],
result2: [
{$match: {pageCount:{$ne:0}}},
{$count:"NonZeroPages"},
]
}},
{$project: {
ZeroPages: {$arrayElemAt: ["$result1.ZeroPages", 0]},
NonZeroPages: {$arrayElemAt: ["$result2.NonZeroPages", 0]}
}},
]);
Figura 23. Consulta que devuelve los libros con 0 páginas y las que no
db.books.aggregate([{$group:{_id:"$status",count:{$count:{}}}}])
4. Consultas de la colección 2
db.companies.dataSize()
La colección tiene 17893 documentos que coindice con el número de compañías únicas.
db.companies.count()
db.companies.distinct("name").length
c. ¿Cuántas compañías se fundaron en los años 1996, 1997, 2001 y 2005 respectivamente?
db.companies.aggregate([
{$facet: {
1996: [
{$match: {"founded_year": {"$eq": 1996}}},
{$count: "1996"}],
1997: [
{$match: {"founded_year": {"$eq": 1997}}},
{$count: "1997"}],
2001: [
{$match: {"founded_year": {"$eq": 2001}}},
{$count: "2001"}],
2005: [
{$match: {"founded_year": {"$eq": 2005}}},
{$count: "2005"}],
}},
{$project: {
"1996": {$arrayElemAt: ["$1996.1996", 0]},
"1997": {$arrayElemAt: ["$1997.1997", 0]},
"2001": {$arrayElemAt: ["$2001.2001", 0]},
"2005": {$arrayElemAt: ["$2005.2005", 0]},
}}
])
Figura 28. Consulta de las compañías fundadas en los años 1996, 1997, 2001 y 2005
d. Lista las compañías que se dedican a “web” o “mobile” y recupera: nombre, descripción,
número de empleados, email, año, mes y día de su fundación.
Para mostrar el listado solicitado se filtra por el campo category_code, usando el operador
$or para obtener las dos condiciones.
db.companies.find(
{$or: [{category_code:{$eq:"web"}}, {category_code:{$eq:"mobile"}}]},
{_id:0, name:1, description:1, number_of_employees:1, email_address:1,
founded_year:1, founded_month:1, founded_day:1}).pretty()
e. Lista las compañías que se dedican a videojuegos y muéstralas en orden descendente según
el año en que fueron fundadas.
db.companies.find({category_code:"games_video"}, {_id:0,name:1,
founded_year:1}).sort({ founded_year:-1 }).pretty()
Figura 30. Compañías dedicadas a videojuegos ordenadas por año de fundación descendente
De acuerdo con el resultado de la consulta, 294 compañías tienen 600 empleados o más.
db.companies.find({number_of_employees:{$gte:600}}).count()
Para la presente consulta se usa un filtro anidado usando los operadores $and y $or. De
acuerdo a los datos de la colección no existe ninguna empresa que se dedique a videojuegos y
a la música a la vez, ya que el campo es de tipo string y no array.
db.companies.find(
{$and:[{
founded_year:{$gte:2001,$lte:2005}},
{number_of_employees:{$gte:500}},
{$or:[
{category_code:{$eq:"games_video"}},{category_code:{$eq:"music"}}
]}]},
{_id:0, name:1, homepage_url:1, twitter_username:1,
number_of_employees:1, category_code:1,founded_year:1}).pretty()
Figura 32. Compañías fundadas entre el 2001 y 2005, con más de 500 empleados
h. Lista las empresas que cuentan con única y exclusivamente 2 oficinas en la ciudad de San
Francisco.
Ya que el campo offices es un array de documentos la opción acertada para la consulta es usar
agregación y evaluar el campo offices.city en miras a obtener la respuesta.
db.companies.aggregate([
{$project:{name:1,_id:0,offices:1,officesNum: {"$size": "$offices" }}},
{$match:{"officesNum": 2}},
{$unwind:"$offices"},
{$match:{"offices.city":"San Francisco"}},
{$group:{_id: "$name" ,cnt: { $sum: 1 }}},
{$match:{ cnt: 2 }},
{$project:{_id:1}}
])
La limpieza de datos simplificó esta consulta ya que no es necesario agrupar por name.
i. Lista el nombre, el mes y día de adquisición de las empresas de videojuegos que hayan sido
adquiridas en el año 2007 por un precio igual o superior a los 10 millones de dólares y que
tengan oficinas en la ciudad de Culver City.
db.companies.find(
{$and:[
{category_code:"games_video"},
{offices:{$elemMatch:{city : "Culver City"}}},
{"acquisition.acquired_year" : 2007},
{"acquisition.price_amount" : {$gte:10000000}}
]}
,{name:1,"acquisition.acquired_month":1,"acquisition.acquired_day":1,_id:0}
).pretty()
Figura 34. Compañías de videojuegos de Culver City adquiridas en el 2007 por más de 10M
5. Referencias bibliográficas