我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要架构验证。我看了看mongokit,但我想要一个类似于映射器的东西,这样它就可以从对象的属性中保存,而不是字典。
我想要一个映射器,这样我就可以使用现有对象而无需修改它们。
我正在尝试从sqlalchemy(SQlite)迁移到使用mongodb。我想要架构验证。我看了看mongokit,但我想要一个类似于映射器的东西,这样它就可以从对象的属性中保存,而不是字典。
我想要一个映射器,这样我就可以使用现有对象而无需修改它们。
Answers:
另一个选择是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()
对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
您想要MongoKit。它是比PyMongo高一层的抽象层。不知道您使用的是Django,还是django-mongokit集成。
此博客文章中的示例。请注意,一旦定义了结构(例如atari.make,c64.model等),然后Computer实例就可以直接引用make / 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']},
]
我知道这个问题我来晚了,但是我是Ming http://merciless.sourceforge.net的作者,Ming是一个受SQLAlchemy启发的MongoDB验证和ORM引擎。这是我们在SourceForge上使用的,并且在http://www.slideshare.net/rick446/rapid-and-scalable-development-with-mongodb-pymongo-and-ming上有一个合理的演示文稿,以及关于从SQLAlchemy迁移到Ming http://www.slideshare.net/__amol__/from-sqlalchemy-to-ming-with-turbogears2。这是Ming中的ORM层的一个示例(来自教程):
class WikiPage(MappedClass):
class __mongometa__:
session = session
name = 'wiki_page'
_id = FieldProperty(schema.ObjectId)
title = FieldProperty(str)
text = FieldProperty(str)
comments=RelationProperty('WikiComment')
查询使用标准的MongoDB查询语法(而不是Django ORM的magic关键字参数):
WikiComment.query.find(dict(page_id=wp._id))