Persistencia No-SQL

En esta tarea usaremos un Oject Document Mapper para usar la BD MongoDB. Así se consigue indepedizar (en parte) el código de la BD. Mongoengine es parecido al orm de django

Tendremos que instalar la BD, y también mongoengine, para acceder a la BD desde python



Definir un esquema parla la BD, y hacer un script para rellenar la BD

Usaremos la BD datos de test de mongoDB, y haremos un script de población de la BD para añadir algunos restaurantes en Granada, y probar el ODM

populate.py


from mongoengine import *
import datetime

connect('test')

# Esquema para la BD de pruebas de mongoDB

class addr(EmbeddedDocument):
    building = StringField()
    street   = StringField()
    city     = StringField()   # añadido
    zipcode  = IntField()
    coord    = GeoPointField() # OJO, al BD de test estan a revés
                               # [long, lat] en vez de [lat, long]

class likes(EmbeddedDocument):
    grade = StringField(max_length=1)
    score = IntField()
    date  = DateTimeField()

class restaurants(Document):
    name             = StringField(required=True, max_length=80)
    restaurant_id    = IntField()
    cuisine          = StringField()
    borough          = StringField()
    address          = EmbeddedDocumentField(addr)              # en la misma collección
    grades           = ListField(EmbeddedDocumentField(likes))


dir = addr(street="Hermosa, 5 ", city="Granada", zipcode=18010, coord=[37.1766872, -3.5965171])  # así están bien
r = restaurants(name="Casa Julio", cuisine="Granaina", borough="Centro", address=dir)
r.save()

# Poner alguno más
# ...

# Consulta, los tres primeros
for r in restaurants.objects[:3]:
    print (r.name, r.address.coord, r.grades[0].date)

# Hacer más consultas, probar las de geolocalización
# ...

Se pueden añadir más validaciones, o valores por defecto (Defining Documents)

Añadir varios restaurantes y probar las consultas a la BD. Para averiguar las coordenadas se puede usar el servicio de geocodificación de google, p.e.


http://maps.googleapis.com/maps/api/geocode/json?address=Bar+Casa+Juilo+Granada
, que devueleve un string JSON. o en XML

http://maps.googleapis.com/maps/api/geocode/xml?address=Bar+Casa+Juilo+Granada
,
Para el requerimento se puede usar la librería requests