阅读 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
我的问题是我正在使用 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