阅读 MongoEngine 动态文档

Read MongoEngine DynamicDocuments

我的问题是我正在使用 MongoEngine:

保存 dict 对象
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 取回数据的正确方法是什么?

问题不在于 MongoRecord 是一个 DynamicDocument 或者它包含一个字典。使用常规 Document 会得到相同的结果。您的问题是查询,您应该将 record.objects 更改为 MongoRecord.objects 以获得游标。

关于您对 switch_collection() 的使用... 如果MongoRecord个文档会被保存到一个同名的集合中,大多数情况下,你可以像下面这样定义,当一个同名的集合被保存时,你不必使用switch_collection()查询。

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

如果您确实想从未称为 '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