Pymongo: análisis de la consulta de serialización de una colección
Pregunta
Por defecto collection.find
o collection.findone()
Las funciones dan como resultado un tipo de diccionario y si pasa paramater as_class=SomeUserClass
Entonces intentará analizar el resultado en este formato de clase. Pero parece que esta clase también debería ser derivada de la clase de diccionario (como se requiere __setitem__
función para definirse y puedo agregar claves en la clase). Aquí quiero establecer las propiedades de la clase. ¿Cómo puedo lograr esto? Además, mi clase de colección contiene algunas clases de niños como propiedades. Así que cómo puedo establecer las propiedades de las clases de niños también.
Solución 2
He resuelto esto agregando __setitem__
en la clase. que yo
result = as_class()
for key,value in dict_expr.items():
result.__setitem__(key,value)
Y en mi clase __setitem__
es como
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
Otros consejos
Parece que quieres algo como un mapeador relacional de objetos. Soy el autor principal de uno Ming , pero también existen varios otros para Python. En Ming, puede hacer lo siguiente para configurar su mapeo:
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()
Luego puede consultar una página en particular a través de:
pg = WikiPage.query.get(title='MyPage')
pg.comments # loads comments via a second query from MongoDB
Los diversos ODM que conozco para MongoDB en Python se enumeran a continuación.