Python的MongoDB ORM?

Python的MongoDB ORM?,python,mongodb,Python,Mongodb,我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要一张图表。我正在看mongokit,但是我想要一些类似于映射器的东西,这样它就可以从对象的属性中保存,而不是从dict中保存 我想要一个映射器,这样我就可以在不修改现有对象的情况下使用它们。您需要。它是一个抽象层,高于。不确定您是否在使用Django,但也有集成 从这个例子。请注意,一旦定义了结构,计算机实例就可以直接引用make/model(例如atari.make、c64.model等)。不需要字典: impor

我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要一张图表。我正在看mongokit,但是我想要一些类似于映射器的东西,这样它就可以从对象的属性中保存,而不是从dict中保存

我想要一个映射器,这样我就可以在不修改现有对象的情况下使用它们。

您需要。它是一个抽象层,高于。不确定您是否在使用Django,但也有集成

从这个例子。请注意,一旦定义了结构,计算机实例就可以直接引用make/model(例如atari.make、c64.model等)。不需要字典:

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']}, 
    ]
另一个选择是。MongoEngine的ORM与Django使用的ORM非常相似

示例(来自教程):


由于对MongoKit或MongoEngine都不满意,我决定为Python编写自己的面向对象接口

我将所有查询直接委托给pymongo,因此那里的查询语法是相同的。大多数情况下,它只是一个围绕结果的对象包装器,还有一些其他帮助工具,如数据库连接池、DBRef支持和其他方便的方法,使您的生活更轻松

它被称为,可以从github获得。快乐的黑客

例如:

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

我知道我对这个问题的回答已经晚了,但我是Ming的作者,Ming是一个受SQLAlchemy启发的MongoDB验证和ORM引擎。这就是我们在SourceForge上使用的,在上有一个合理的演示,还有一个从SQLAlchemy迁移到Ming的案例研究。以下是Ming中ORM层的示例(来自教程):

class WikiPage(MappedClass):
类uuu mongometa uuuuuu:
会话=会话
名称='wiki_页面'
_id=FieldProperty(schema.ObjectId)
标题=字段属性(str)
text=FieldProperty(str)
comments=RelationProperty('WikiComment')
查询使用标准MongoDB查询语法(不是Django ORM的magic关键字参数):

WikiComment.query.find(dict(page\u id=wp.\u id))


有没有一种方法可以在不修改现有业务逻辑对象的情况下执行此操作?在sqlalchemy中,您可以使用映射器。更多外科手术更改。保持依赖关系图干净。这是有道理的,尽管我看不到直接这样做的方法。也许是像MongoComputer(计算机、文档)之类的奇怪的东西,或者是某种形式的混合?有趣…它在sqlalchemy中是干净的,因此问题是,自2015年以来mongokit中没有代码更改,自2014年以来没有发布。该死,我不明白这个python世界:(.AFAIK.您不能在mongoengine的文档中动态添加属性。这会让mongodb失去一些乐趣。如果需要,您可以使用DictField添加任何类型的完全无模式的数据。或者使用GenericEmbeddedDocument?mongoengine存在一些严重的性能问题。如果您想在生产中使用它,它只有在您有这是一个非常简单、轻量级的模式。对于那些想要更全面地了解可用于Python的MongoDB ORMs的人来说,PyMongo“工具”页面列出了很多,并且定期维护:Ming对我们来说似乎是一条出路。它既有我们需要的灵活性,也有我们需要的模式概念。当我们需要电源时,我们会转到pymongo。我对mongo和python不熟悉。有没有教程可以让我参考,以创建像django的model.py这样的模型和创建迁移脚本usi吴明。确切地说,它应该被称为“DRM”(文档资源映射)这应该有助于回答您的查询有一个名为蒙古的库,让您通过属性或字典访问与mongo对象交互,并具有模式验证,您可以启用:@zsong Relational and Document…不应该称为对象关系和对象文档?这可能会有帮助:这非常有用且简单,I just想要一些东西,这样我就不会被困在创建字典的工作中,没有别的。这真的很好。可惜它不再被维护了:(
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