MongoDB con MongoEngine

El uso de una base de datos de documentos como MongoDB es una alternativa común a las bases de datos relacionales SQL. Este patrón muestra cómo utilizar MongoEngine, una biblioteca de mapeo de documentos, para integrarse con MongoDB.

Se requiere un servidor MongoDB en funcionamiento y Flask-MongoEngine.

pip install flask-mongoengine

Configuración

La configuración básica puede hacerse definiendo MONGODB_SETTINGS en app.config y creando una instancia de MongoEngine:

from flask import Flask
from flask_mongoengine import MongoEngine

app = Flask(__name__)
app.config['MONGODB_SETTINGS'] = {
    "db": "myapp",
}
db = MongoEngine(app)

Documentos de mapeo

Para declarar un modelo que represente un documento Mongo, crea una clase que herede de Document y declara cada uno de los campos

import mongoengine as me

class Movie(me.Document):
    title = me.StringField(required=True)
    year = me.IntField()
    rated = me.StringField()
    director = me.StringField()
    actors = me.ListField()

Si el documento tiene campos anidados, utilice EmbeddedDocument para definir los campos del documento incrustado y EmbeddedDocumentField para declararlos en el documento padre.

class Imdb(me.EmbeddedDocument):
    imdb_id = me.StringField()
    rating = me.DecimalField()
    votes = me.IntField()

class Movie(me.Document):
    ...
    imdb = me.EmbeddedDocumentField(Imdb)

Creación de datos

Instancie su clase documental con argumentos de palabras clave para los campos. También puedes asignar valores a los atributos de los campos después de la instanciación. Luego llama a doc.save().

bttf = Movie(title="Back To The Future", year=1985)
bttf.actors = [
    "Michael J. Fox",
    "Christopher Lloyd"
]
bttf.imdb = Imdb(imdb_id="tt0088763", rating=8.5)
bttf.save()

Consultas

Utiliza el atributo de clase objects para realizar consultas. Un argumento de palabra clave busca un valor igual en el campo

bttf = Movies.objects(title="Back To The Future").get_or_404()

Los operadores de consulta pueden utilizarse concatenándolos con el nombre del campo mediante un doble guión. Los objetos y las consultas devueltas al llamarlos son iterables:

some_theron_movie = Movie.objects(actors__in=["Charlize Theron"]).first()

for recents in Movie.objects(year__gte=2017):
    print(recents.title)

Documentación

Hay muchas más formas de definir y consultar documentos con MongoEngine. Para más información, consulta la documentación oficial.

Flask-MongoEngine añade útiles utilidades encima de MongoEngine. Consulta también su documentación.