Está en la página 1de 21

Máster Universitario en Análisis y Visualización de Datos Masivos

BASES DE DATOS PARA EL BIG DATA

Actividad 2: Laboratorio. Uso de MongoDB

Presentado por:
Laydi Viviana Bautista Rengifo

Presentado a:
Marlon Cardenas

Mayo, 2023
UNIR - Universidad Internacional de la Rioja
Tabla de Contenidos

1. Carga de Base Datos 3


2. Explora las Colecciones 3
3. Consulta: Colección 1. Books 12
4. Consulta: Colección 2. Companies 13
1. Carga de Base Datos

Se realiza la creación de la base de datos y la importación de los documentos.

mongosh

use miscelanea
db.createCollection("books")
db.createCollection("companies")

mongoimport --db miscelanea --collection books --file


datos/act-2-books.json
mongoimport --db miscelanea --collection companies --file
datos/act-2-companies.json

Books: 431 documentos


Companies: 18801 documentos

2. Explora las Colecciones

Ejemplo de documento de la colección Books:

{
_id: 3,
title: 'Specification by Example',
isbn: '1617290084',
pageCount: 0,
publishedDate: ISODate("2011-06-03T07:00:00.000Z"),
thumbnailUrl:
'https://s3.amazonaws.com/AKIAJC5RLADLUMVRPFDQ.book-thumb-images/adzic.jpg',
status: 'PUBLISH',
authors: [ 'Gojko Adzic' ],
categories: [ 'Software Engineering' ]
}
Ejemplo de documento de la colección Companies:

{
_id: ObjectId("52cdef7c4bab8bd675297d8b"),
name: 'AdventNet',
permalink: 'abc3',
crunchbase_url: 'http://www.crunchbase.com/company/adventnet',
homepage_url: 'http://adventnet.com',
blog_url: '',
blog_feed_url: '',
twitter_username: 'manageengine',
category_code: 'enterprise',
number_of_employees: 600,
founded_year: 1996,
deadpooled_year: 2,
tag_list: '',
alias_list: 'Zoho ManageEngine ',
email_address: 'pr@adventnet.com',
phone_number: '925-924-9500',
description: 'Server Management Software',
created_at: ISODate("2007-05-25T19:24:22.000Z"),
updated_at: 'Wed Oct 31 18:26:09 UTC 2012',
overview: '<p>AdventNet is now <a href="/company/zoho-manageengine" title="Zoho
ManageEngine" rel="nofollow">Zoho ManageEngine</a>.</p>\n' +
'\n' +
'<p>Founded in 1996, AdventNet has served a diverse range of enterprise IT,
networking and telecom customers.</p>\n' +
'\n' +
'<p>AdventNet supplies server and network management software.</p>',
image: {
available_sizes: [
[
[ 150, 55 ],
'assets/images/resized/0001/9732/19732v1-max-150x150.png'
],
[
[ 150, 55 ],
'assets/images/resized/0001/9732/19732v1-max-250x250.png'
],
[
[ 150, 55 ],
'assets/images/resized/0001/9732/19732v1-max-450x450.png'
]
]
},
products: [],
relationships: [
{
is_past: true,
title: 'CEO and Co-Founder',
person: {
first_name: 'Sridhar',
last_name: 'Vembu',
permalink: 'sridhar-vembu'
}
},
{
is_past: true,
title: 'VP of Business Dev',
person: {
first_name: 'Neil',
last_name: 'Butani',
permalink: 'neil-butani'
}
},
{
is_past: true,
title: 'Usabiliy Engineer',
person: {
first_name: 'Bharath',
last_name: 'Balasubramanian',
permalink: 'bharath-balasibramanian'
}
},
{
is_past: true,
title: 'Director of Engineering',
person: {
first_name: 'Rajendran',
last_name: 'Dandapani',
permalink: 'rajendran-dandapani'
}
},
{
is_past: true,
title: 'Market Analyst',
person: {
first_name: 'Aravind',
last_name: 'Natarajan',
permalink: 'aravind-natarajan'
}
},
{
is_past: true,
title: 'Director of Product Management',
person: {
first_name: 'Hyther',
last_name: 'Nizam',
permalink: 'hyther-nizam'
}
},
{
is_past: true,
title: 'Western Regional OEM Sales Manager',
person: { first_name: 'Ian', last_name: 'Wenig', permalink: 'ian-wenig' }
}
],
competitions: [],
providerships: [
{
title: 'DHFH',
is_past: true,
provider: { name: 'A Small Orange', permalink: 'a-small-orange' }
}
],
total_money_raised: '$0',
funding_rounds: [],
investments: [],
acquisition: null,
acquisitions: [],
offices: [
{
description: 'Headquarters',
address1: '4900 Hopyard Rd.',
address2: 'Suite 310',
zip_code: '94588',
city: 'Pleasanton',
state_code: 'CA',
country_code: 'USA',
latitude: 37.692934,
longitude: -121.904945
}
],
milestones: [],
video_embeds: [],
screenshots: [
{
available_sizes: [
[
[ 150, 94 ],
'assets/images/resized/0004/3400/43400v1-max-150x150.png'
],
[
[ 250, 156 ],
'assets/images/resized/0004/3400/43400v1-max-250x250.png'
],
[
[ 450, 282 ],
'assets/images/resized/0004/3400/43400v1-max-450x450.png'
]
],
attribution: null
}
],
external_links: [],
partners: []
}
a. Identifica todas las distintas categorías (categories) de la colección books.

1. Microsoft 8. Microsoft .NET 15. Python


2. Open Source 9. SOA 16. Computer Graph
3. Client-Server 10. Software 17. Mobile Technology
4. Object-Oriented Engineering 18. Web Development
Programming 11. Internet 19. Networking
5. Miscella 12. In Action 20. Object-Technology
6. internet 13. Mobile Programming
7. Theory 14. Java

db.books.aggregate([
{ $unwind: "$categories" },
{ $group: { _id: "$categories" } }
])
b. Identifica los distintos estados (status) de la colección books.

Hay dos estados para los libros:

- Publish
- Meap

db.books.aggregate([
{ $group: { _id: "$status" } }
])

c. Describe brevemente qué arroja la siguiente consulta:

db.getCollection('books').find(
{longDescription: {$gte: "A", $lt: "B"}},
{title: 1, longDescription: 1}
)

Teniendo en cuenta que la sintaxis de find es: db.<coleccion>.find( <filtros>, <proyecciones>)


La anterior consulta aplica el filtro tiene la condición de que el campo longDescription sea
mayor o igual que “A” y menor que “B”, es decir, cuando longDescription tenga un carácter
inicial de “A”. Luego, imprime en pantalla los campos title y longDescription de los documentos
que cumplen. El valor "1" después de campo title y longDescription se utiliza para incluir un
campo específico en el resultado y el valor "0" se utiliza para excluirlo. MongoDB interpretará
cualquier valor distinto de cero como un "1".

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.

db.getCollection('books').find( {
status: "PUBLISH",
authors: { $size: 2 }
},
{ title: 1, longDescription: 1, status: 1, authors: 1 }
)

e. Describe brevemente qué ocurre si a la consulta del punto anterior le añades al final la
siguiente instrucción: .toArray()

En el caso anterior, la forma en como MongDB devuelve el resultado es un objeto llamado


Cursor que permite acceder a los resultados, donde incluso se pueden utilizar métodos como
next() para obtener el siguiente documento del cursor, o métodos como forEach() para iterar
sobre todos los documentos, así que si agregamos .toArray, el resultado será un array de
documentos, y ya no se pueden acceder a los métodos mencionado anteriormente.

db.getCollection('books').find( {
status: "publicado",
authors: { $size: 2 }
},
{ title: 1, longDescription: 1, status: 1, authors: 1 }
).toArray()
f. ¿Qué ocurre si ahora también le añades lo siguiente?: .forEach(function(valor,
indice, array){print("Titulo: " + valor.title + "Author 1: " + valor.authors[0] + "
Author 2: " + valor.authors[1] + " Registro No. " + indice);})
¿Para qué crees que sería útil esto último?

En este caso, por cada documento que cumpla la condición se va a ejecutar una función que va a
imprimir en pantalla un mensaje obteniendo título, el nombre de los autores y el índice, este
último atributo, el índice es un valor que indica la posición del documento en el array y se crear
al momento de utilizar la función .toArray().

Esto puede ser útil para mejorar la presentación de la información hacia el usuario.

db.getCollection('books').find(
{status: "PUBLISH",authors: { $size: 2 }},
{ title: 1, longDescription: 1, status: 1, authors: 1 }
).toArray().forEach(function(valor, indice, array){
print("Titulo: " + valor.title + "Author 1: " + valor.authors[0] + "
Author 2: " + valor.authors[1] + " Registro No. " + indice);
})
3. Consulta: Colección 1. Books

a. ¿Cuál es el tamaño de la colección (en bytes)? Ayuda: db.<collection>.dataSize()

El tamaño en bytes de la Colección books es de 517474 bytes.

db.books.dataSize()

b. ¿Cuántos libros tiene la colección?

La Colección tiene 431 libros

db.books.countDocuments()

c. ¿Cuántos libros tienen 200 o más páginas?

La cantidad de libros con más de 200 páginas son: 264

db.books.find({ pageCount: {"$gte": 200}}).count()


d. ¿Cuántos libros tienen entre 300 y 600 páginas? [300, 600]

La cantidad de libros entre 300 y 600 páginas son: 215

db.books.find({ pageCount: {"$gte": 300 , "$lte": 600} } ).count()

e. ¿Cuántos libros tienen 0 páginas y cuántos no?

La cantidad de libros que tiene 0 páginas son 166 y los que no son 265.

db.books.find({ pageCount: 0}).count()


db.books.find({ pageCount: { "$ne": 0}}).count()

f. ¿Cuántos libros han sido publicados y cuántos no?

La cantidad de libros publicados son 363.

db.books.find({ status: "PUBLISH"}).count()

4. Consulta: Colección 2. Companies

a. ¿Cuál es el tamaño de la colección (en bytes)?


El tamaño en bytes de la Colección books es de 72236994

db.companies.dataSize()

b. ¿Cuántas compañías tiene la colección?

La colección tiene 18802 compañías.

db.companies.countDocuments()

c. ¿Cuántas compañías se fundaron en los años 1996, 1997, 2001 y 2005 respectivamente?

La cantidad de compañías creadas fueron 216, 200, 464, 961 en los años 1996, 1997, 2001 y
2005 respectivamente.

db.companies.aggregate([
{ $group: { _id: "$founded_year", companies_created: { $sum: 1 }}},
{ $match: { _id: { $in: [1996, 1997, 2001, 2005] }}},
{ $sort: { _id: 1 } }
])
d. Lista las compañías que se dedican a «web» o «mobile» y recupera: el nombre,
descripción, número de empleados, email, año, mes y día de su fundación.

db.companies.find(
{ $or: [ { category_code: "web" }, { category_code: "mobile" } ] },
{
name: 1,
description: 1,
number_of_employees: 1,
email_address: 1,
founded_year: { $year: "$founded_at" },
founded_month: { $month: "$founded_at" },
founded_day: { $dayOfMonth: "$founded_at" }
}
).toArray()
e. Lista las compañías que se dedican a videojuegos y muéstrales en orden descendente
según el año en que fueron fundadas.

db.companies.find(
{ category_code: "games_video" }
).sort( { founded_year: -1 } )

f. ¿Cuántas compañías tienen 600 o más empleados?

La cantidad de compañías que tienen 600 o más empleados son 303 compañías.

db.companies.find({ number_of_employees: {"$gte": 600} } ).count()


g. Recupera el nombre, la URL, el usuario de Twitter y el número de empleados de las
compañías fundadas entre los años 2001 y 2005, ambos incluidos, que cuenten con 500 o
más empleados y que se dediquen a los videojuegos o a la música.

db.companies.find(
{
founded_year: { $gte: 2001, $lte: 2005 },
number_of_employees: { $gte: 500 },
$or: [
{ category_code: "games_video" },
{ category_code: "music" }
]
},
{
name: 1,
homepage_url: 1,
twitter_username: 1,
number_of_employees: 1
})

¿Alguna empresa se dedica a videojuegos y a la música a la vez?

Para resolver esta pregunta, se plantearon dos formas de verificar si el campo category_code
podría tener games_video y music al mismo tiempo, primero podemos ver que para todos los
documentos, el atributo category_type es de tipo string o nulo.
Realizando la siguiente consulta:

db.getCollection('companies').aggregate([
{ $addFields: { category_type: { $type: "$category_code" } } },
{ $group: { _id: "$category_type", count: { $sum: 1 }}}
])

Hay 16050 documentos con el campo category_type en String y 2751 con el campo en nulo.

Y por último se aplicó una búsqueda, de tipo regex para encontrar algún documento que en el
campo category_type tuviera la palabra games_video y music al mismo tiempo, y el resultado
fue cero.

db.companies.find(
{ $and: [ { category_code: { $regex: "games" } },
{ category_code: { $regex: "music" } }] }
).count()
h. Lista las empresas que cuentan con única y exclusivamente 2 oficinas en la ciudad de San
Francisco.

Las empresas que cuentan con única y exclusivamente 2 oficinas en la ciudad de San Francisco
son 2 empresas: Notifixious y GoGrid.

db.getCollection('companies').aggregate([
{ $match: { "offices": { $size: 2 } } },
{ $unwind: "$offices" },
{ $match: { "offices.city": 'San Francisco' } },
{ $group: { _id: { _id: "$_id", name: "$name"}, count: { $sum: 1 } } },
{ $match: { count: 2 } },
{ $project: { _id: "$_id._id", name: "$_id.name" } }
]).toArray().forEach(function(valor, indice, array){
print(indice + "." + valor.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.

En este caso, solo la empresa Flektor cumple con las condiciones.

db.companies.aggregate([
{ $match: {
category_code: "games_video",
"acquisition.acquired_year": 2007,
"acquisition.price_amount": { $gte: 10000000} }
},
{ $unwind: "$offices" },
{ $match: { "offices.city": 'Culver City' } },
{ $group: { _id: {
_id: "$_id",
name: "$name",
year: "$acquisition.acquired_year",
month: "$acquisition.acquired_month"}}
},
{ $project: {
_id: "$_id._id",
name: "$_id.name",
year_acquisition: "$_id.year",
month_acquisition: "$_id.month"}
}
])

También podría gustarte