¿MongoDB ORM para Python? [closed]

5 minutos de lectura

avatar de usuario
timi

Estoy tratando de migrar de sqlalchemy (SQlite) a usar mongodb. Me gustaría verificación de esquema. Estoy mirando mongokit, pero quiero algo que sea similar a los mapeadores, para que se salve de la propiedad del objeto, y no de un dictado.

Me gustaría un mapeador para poder usar objetos existentes sin modificarlos.

  • Precisamente, debería llamarse “DRM” (Document-Resource-Mapping)

    – zs2020

    26 de enero de 2012 a las 21:27

  • Esto debería ayudarte a responder tu consulta. docs.mongodb.org/ecosystem/drivers/php-libraries

    – Basav

    29 de septiembre de 2013 a las 4:12

  • Hay una biblioteca llamada mongolia que te permite interactuar con objetos mongo a través de atributos o acceso al diccionario y tiene una verificación de esquema que puedes habilitar: github.com/zagaran/mongolia

    – Zags

    11 de marzo de 2014 a las 0:45

  • @zsong Relacional y Documento… ¿No debería llamarse Objeto Relacional y Documento de Objeto?

    – Jaime Sangcap

    26 de febrero de 2015 a las 11:05

  • esto puede ser útil: pythonhosted.org/Flask-MongoAlchemy

    – Besos y abrazos

    2 mayo 2019 a las 17:52

avatar de usuario
david narayan

Otra opción es MongoMotor. El ORM de MongoEngine es muy similar al ORM utilizado por Django.

Ejemplo (del tutorial):

class Post(Document):
    title = StringField(max_length=120, required=True)
    author = ReferenceField(User)

class TextPost(Post):
    content = StringField()

class ImagePost(Post):
    image_path = StringField()

class LinkPost(Post):
    link_url = StringField()

  • HASTA DONDE SE. No puede agregar propiedades sobre la marcha al documento de mongoengine. Lo que le quita algo de diversión a mongodb.

    – tutuca

    7 sep 2011 a las 14:14

  • Puede usar DictField para agregar cualquier tipo de datos totalmente sin esquema si lo necesita.

    – Neuman

    15 de marzo de 2012 a las 1:33

  • Mongoengine tiene algunos problemas de rendimiento graves. Si desea usarlo en producción, solo funcionará si tiene un esquema muy simple y liviano.

    –Valerie R. Coffman

    22 de junio de 2017 a las 14:28

  • Para aquellos que buscan una descripción general más completa de los ORM de MongoDB disponibles para Python, la página “Herramientas” de PyMongo enumera algunos de ellos y se mantiene regularmente: api.mongodb.com/python/current/tools.html

    – Ascendente

    12 de marzo de 2018 a las 5:47

  • La página de herramientas de PyMongo se ha movido: pymongo.readthedocs.io/en/stable/tools.html

    – zmccord

    9 abr 2021 a las 22:27

avatar de usuario
slacy

Como no estaba satisfecho ni con MongoKit ni con MongoEngine, decidí escribir mi propia interfaz orientada a objetos para Python.

Delegué todas las consultas directamente a pymongo, por lo que la sintaxis de consulta es la misma. En su mayoría, es solo un contenedor de objetos alrededor de los resultados, con algunos otros ayudantes como la agrupación de conexiones de bases de datos, soporte DBRef y otros métodos convenientes para hacer su vida más fácil.

Se llama minimongo y está disponible en github. ¡Feliz pirateo!

Ejemplo:

from minimongo import Model, MongoCollection 

class MyObject(Model): 
    model = MongoCollection(database="test", collection='my_collection')

m = MyObject()
m.x = 1
m.field = 'value'
m.other = {'list': True}
m.save()

x = MyObject({'x': 1, 'y': 2}).save()

objs = MyObject.find({'x': 1})
for o in objs: 
    print o

  • Esto es súper útil y simple, solo quería algo para no estar atascado creando diccionarios, nada más.

    – vishalv2050

    13 de octubre de 2015 a las 9:56

  • Esto es realmente agradable. Lástima que ya no se mantenga 🙁

    – si __name__ es Ninguno

    04/12/2016 a las 18:55

avatar de usuario
ryan cox

Usted quiere MongoKit. Es una capa de abstracción más alta que PyMongo. No estoy seguro si estás usando Django, pero también hay django-mongokit integración.

Ejemplo de esto entrada en el blog. Tenga en cuenta que las instancias de Computer pueden hacer referencia directamente a la marca/modelo una vez que se define la estructura (por ejemplo, atari.make, c64.model, …). Sin necesidad de diccionarios:

import datetime 
from mongokit import Document

class Computer(Document):

    structure = { 
      'make': unicode, 
      'model': unicode, 
      'purchase_date': datetime.datetime, 
      'cpu_ghz': float, 
    }

    validators = { 
      'cpu_ghz': lambda x: x > 0, 
      'make': lambda x: x.strip(), 
    }

    default_values = { 
      'purchase_date': datetime.datetime.utcnow, 
    }

    use_dot_notation = True

    indexes = [ 
      {'fields': ['make']}, 
    ]

  • ¿Hay alguna manera de hacer esto sin modificar los objetos de lógica empresarial existentes? en sqlalchemy, puede usar mapeadores.

    – Timmy

    6 mayo 2010 a las 14:25

  • más cambio quirúrgico. mantiene su gráfico de dependencia limpio. tiene sentido, aunque no veo una manera de hacerlo directamente. ¿Quizás algo extraño como la clase MongoComputer(Computer,Document) o con algún tipo de combinación? Interesante…

    –Ryan Cox

    6 mayo 2010 a las 19:15

  • está limpio en sqlalchemy, por lo tanto, la pregunta, gracias

    – Timmy

    7 mayo 2010 a las 13:34

  • Sin cambios de código en mongokit desde 2015 y sin lanzamiento desde 2014. Maldición, no entiendo este mundo de python 🙁 .

    – JAR.JAR.frijoles

    14 de agosto de 2018 a las 6:26

  • MongoKit está muerto

    – em2er

    21 oct 2021 a las 17:10

Sé que llegué muy tarde a esta pregunta, pero soy el autor de Ming http://despiadado.sourceforge.net, un motor ORM y validación de MongoDB inspirado en SQLAlchemy. Es lo que usamos en SourceForge, y hay una presentación razonable disponible en http://www.slideshare.net/rick446/desarrollo-rápido-y-escalable-con-mongodb-pymongo-and-ming así como un estudio de caso sobre la migración de SQLAlchemy a Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2. Aquí hay un ejemplo de la capa ORM en Ming (del tutorial):

class WikiPage(MappedClass):

    class __mongometa__:
        session = session
        name="wiki_page"

    _id = FieldProperty(schema.ObjectId)
    title = FieldProperty(str)
    text = FieldProperty(str)
    comments=RelationProperty('WikiComment')

Las consultas utilizan la sintaxis de consulta estándar de MongoDB (no los argumentos de palabras clave mágicas de Django ORM):

WikiComment.query.find(dict(page_id=wp._id))

¿Ha sido útil esta solución?