Python的MongoDB ORM?

95 投票
4 回答
90563 浏览
提问于 2025-04-15 22:25

我正在尝试从使用sqlalchemy(SQLite)转到使用mongodb。我希望能够进行模式验证。我在看mongokit,但我想要一些类似于映射器的东西,这样可以直接从对象的属性保存数据,而不是保存成字典。

我希望有一个映射器,这样我可以使用现有的对象,而不需要修改它们。

4 个回答

31

你需要的是 MongoKit。它比 PyMongo 更高一层,简单来说就是它提供了更方便的使用方式。如果你在用Django框架的话,还有一个叫 django-mongokit 的工具可以帮你更好地集成。

这里有个来自 博客文章 的例子。注意,一旦定义好结构,Computer的实例就可以直接引用它的品牌和型号,比如 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']}, 
    ]
42

因为对MongoKit和MongoEngine都不太满意,我决定自己写一个面向对象的接口来用在Python上。

我把所有的查询直接交给pymongo处理,所以查询的语法是一样的。基本上,它只是对结果的一个对象封装,还有一些其他的辅助功能,比如数据库连接池、DBRef支持,以及一些方便的方法,让你的工作更轻松。

这个项目叫做 Minimongo,可以在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
76

另一个选择是 MongoEngine。MongoEngine的对象关系映射(ORM)和Django使用的ORM非常相似。

下面是一个例子(来自教程):

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()

撰写回答