我有一个Mongodb集合,我已经为集合中的文档创建了一个Python类。该类具有一些未与文档一起存储的属性和方法。我应该尝试存储它们以使属性可搜索,还是我不应该存储它们并在Python中搜索对象?
以下是一个例子:
# Child
class Child:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
@property
def parent(self):
try:
return Parent(**db.Parents.find_one({'child':self._id}))
except:
return None
# Parent
class Parent:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
@property
def child(self):
try:
return Child(**db.Children.find_one({'parent':self._id}))
except:
return None
在这个例子中,要搜索父母姓名为“foo”的所有孩子,我必须这样做:
results = [Child(**c) for c in db.Children.find() if c.parent.name == 'foo']
这意味着我必须从Mongodb中提取所有子文档并进行搜索。将父数据(或其子集)写入子文档是否更明智,因此我可以使用Mongodb进行搜索?所以我的Child课程看起来像这样:
# Child
class Child:
def __init__(self, **kwargs):
self.__dict__.update(kwargs)
@property
def parent_name(self):
try:
return db.Parents.find_one({'child':self._id})['name']
except:
return None
def _save(self):
# something like this to get and save all the properties
data = {m[0]:getattr(self,m[0]) for m in inspect.getmembers(self)}
db.Children.find_and_modify({'_id':self._id},{'$set':data},upsert=True)
# search
results = [Child(**c) for c in db.Children.find({'parent_name':'foo'})]
因此搜索效率更高,但我认为必须更新Child对象可能会非常痛苦和危险。如果我更改父级的名称,我还必须重写其子级。感觉不对。任何更好的想法???
答案 0 :(得分:2)
您无需加载所有 Children
。
parent_ids = db.Parents.find({'name': 'foo'}).distinct('_id')
children = db.Children.find({'parent': {'$in': parent_ids}})
(另外,为什么您的父上有child
字段,而字段上有parent
字段?)