PYMongo:解析|序列化集合的查询输出

时间:2011-10-19 12:25:19

标签: python mongodb pymongo

默认情况下,collection.findcollection.findone()函数会生成字典类型,如果您传递参数as_class=SomeUserClass,则会尝试将结果解析为此类格式。 但似乎这个类也应该是派生类的字典(因为它需要定义__setitem__函数,我可以在类中添加键。 在这里,我想设置类的属性。我怎么能做到这一点? 此外,我的集合类包含一些子类作为属性。所以我如何设置子类的属性。

2 个答案:

答案 0 :(得分:0)

听起来你想要像对象关系映射器这样的东西。我是一个Ming的主要作者,但是Python也存在其他几个。在Ming中,您可以执行以下操作来设置映射:

from ming import schema, Field
from ming.orm import (mapper, Mapper, RelationProperty, 
    ForeignIdProperty)

WikiDoc = collection(‘wiki_page', session,
    Field('_id', schema.ObjectId()),
    Field('title', str, index=True),
    Field('text', str))
CommentDoc = collection(‘comment', session,
    Field('_id', schema.ObjectId()),
    Field('page_id', schema.ObjectId(), index=True),
    Field('text', str))

class WikiPage(object): pass
class Comment(object): pass

ormsession.mapper(WikiPage, WikiDoc, properties=dict(
    comments=RelationProperty('WikiComment')))
ormsession.mapper(Comment, CommentDoc, properties=dict(
    page_id=ForeignIdProperty('WikiPage'),
    page=RelationProperty('WikiPage')))

Mapper.compile_all()

然后您可以通过以下方式查询某个特定页面:

pg = WikiPage.query.get(title='MyPage')
pg.comments # loads comments via a second query from MongoDB

我在Python中了解MongoDB的各种ODM如下所示。

答案 1 :(得分:0)

我通过在课堂上添加__setitem__来解决这个问题。 比我做的

result = as_class()
for key,value in dict_expr.items():
        result.__setitem__(key,value)

和我的班级__setitem__就像

def __setitem__(self,key,value):
     try:
        attr = getattr(class_obj,key)
        if(attr!=None):
            if(isinstance(value,dict)):
                for child_key,child_value in value.items(): 
                    attr.__setitem__(child_key,child_value)
                setattr(class_obj,key,attr)
            else:
                setattr(class_obj,key,value)

    except AttributeError:
       pass