!pip install --upgrade pymongo

from pprint import pprint as pp
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib

%matplotlib inline
matplotlib.style.use('ggplot')

%%bash
sudo apt-get update
sudo apt-get install -y mongodb-clients

"""
Explanation: NoSQL (MongoDB) (Ejemplo de Replica Set y Sharding)

Esta hoja muestra cómo crear un clúster (simulado con docker-compose donde se mantienen dos replica sets (conjuntos de réplicas) y una colección (posts) que se divide en cada una de esas dos replica sets. Al final se indica cómo escalar y añadir más hosts a las replica sets.
End of explanation
"""


%%bash
cat << END | mongo --host mongo_mongocfg1_1
rs.initiate(); // Iniciar el replica set de los servidores de configuración
sleep(1000);
rs.status()
END

%%bash
cat <<END | mongo --host mongo_mongors1_1
rs.initiate(); // Inicio del RS
sleep(1000);
cfg = rs.conf();
cfg.members[0].host = "mongo_mongors1_1"; // Cambiar el host porque docker coge el hostname del contenedor
rs.reconfig(cfg);  // Reconfigurar
//rs.add(host2/3)  // Añadir posibles nuevos hosts añadidos al RS
rs.status()
END

%%bash
cat <<END | mongo --host mongo_mongors2_1
rs.initiate();
sleep(1000);
cfg = rs.conf();
cfg.members[0].host = "mongo_mongors2_1";
rs.reconfig(cfg);
//rs.add(host2/3)
rs.status()
END

import pymongo
from pymongo import MongoClient

"""
Explanation: Usaremos la librería pymongo para python. La cargamos a continuación.
End of explanation
"""


client = MongoClient("mongo_mongors1_1",27017)
client

client.database_names()

%%bash
file=../Posts.csv
test -e $file || wget http://neuromancer.inf.um.es:8080/es.stackoverflow/`basename ${file}`.gz -O - 2>/dev/null | gunzip > $file

db = client.stackoverflow
db = client['stackoverflow']
db

posts = db.posts
posts

"""
Explanation: La conexión se inicia con MongoClient en el host descrito en el fichero docker-compose.yml (mongo).
End of explanation
"""


%%bash
mongoimport --db stackoverflow --collection posts --drop --type csv \
    --headerline --host=mongo_mongors1_1 --file ../Posts.csv

posts.count()

"""
Explanation: Importación de los ficheros CSV. Por ahora creamos una colección diferente para cada uno. Después estudiaremos cómo poder optimizar el acceso usando agregación.
End of explanation
"""


posts.create_index('Id')

"""
Explanation: Creamos el índice por el que se creará el shard. Por defecto es de tipo ASCENDING.
End of explanation
"""


%%bash
cat <<END | mongo --host mongo_mongos_1
sh.addShard("mongors1/mongo_mongors1_1:27017");
sh.addShard("mongors2/mongo_mongors2_1:27017");
sh.enableSharding("stackoverflow");
sh.shardCollection('stackoverflow.posts', {'Id': 1})
END

%%bash
cat <<END | mongo --host mongo_mongos_1
sh.status()
END

"""
Explanation: Añadimos al shard ambos ordenadores de ambos replica sets, y activamos el sharding en la tabla posts.
End of explanation
"""


post = posts.find_one()
post

posts.find({"PostTypeId": 2}).explain()

"""
Explanation: 
End of explanation
"""


