2017-06-13 16 views
0

私の問題は、私がMongoEngineでのdictオブジェクトを保存していますということです。読むMongoEngine DynamicDocuments

class MongoRecord(DynamicDocument): 
    record_id = SequenceField(primary_key = True) 

class SimpleMongo(object): 
    def __init__(self, *args, **kwargs): 
     """ 
     Very simple dict-like Mongo interface 
     """ 
     if PY_VERSION == 2: 
      self.iterattr = 'iteritems' 
     else: 
      self.iterattr = 'items' 
     self.debug = DEBUG 
     self.dict_type = type(dict()) 
     self.dbname = kwargs.get('dbname', 'untitled') 
     self.collection_name = kwargs.get('collection', 'default') 
     self.ip = kwargs.get('ip', '127.0.0.1') 
     self.port = kwargs.get('port', 27017) 
     self.dbconn = connect(self.dbname, host=self.ip, port=self.port) 
     drop = kwargs.get('drop', False) 
     if drop: 
      self.dbconn.drop_database(self.dbname) 

    def put(self, data): 
     """ 
     Put dict 
     """ 
     assert type(data) == self.dict_type 
     record = MongoRecord() 
     record.switch_collection(self.collection_name) 
     generator = getattr(data, self.iterattr) 
     __res__ = [setattr(record, k, v) for k,v in generator()] # iteritems() for Python 2.x 
     record.save() 

が、それらにアクセスしようとしている:

def get(self): 
    record = MongoRecord() 
    record.switch_collection(self.collection_name) 
    return record.objects 

mongoengine.queryset.managerを得ます。 QuerySetManagerオブジェクトであり、イテレータではありません。 DynamicDocumentとして保存されているMongoのデータを元に戻す適切な方法は何ですか?

答えて

1

MongoRecordDynamicDocumentであるか、またはそれがdictを含んでいるという問題ではありません。あなたは普通のDocumentと同じ結果を得るでしょう。あなたの問題はクエリにあります。record.objectsMongoRecord.objectsに変更してカーソルを取得する必要があります。 switch_collection()の使用状況について

... MongoRecordた場合の文書はほとんどの回で、あなたは以下のようにこれを定義することができ、同じ名前のコレクションに保存され、あなたは時にコレクションswitch_collection()を使用する必要はありませんその名前が照会されています。場合

class MongoRecord(DynamicDocument): 
    record_id = SequenceField(primary_key = True) 
    meta = {'collection': 'records'} 

、あなたのようにそれを行うことができます、あなたは「記録」と呼ばれていないコレクションからMongoRecordドキュメントを取得したいです、あなたは(UnboundLocalErrorを与えることができます)、このための関数を定義したいですこの(source):

from mongoengine.queryset import QuerySet 


def get(self): 
    new_group = MongoRecord.switch_collection(MongoRecord(), self.collection_name) 
    new_objects = QuerySet(MongoRecord, new_group._get_collection()) 
    all = new_objects.all() 
    # If you would like to filter on an MongoRecord attribute: 
    filtered = new_objects.filter(record_id=1) 
    return all