У меня есть коллекция 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
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'})]
Таким образом, поиск более эффективен, но я думаю, что необходимость обновлять дочерние объекты может быть болезненной и опасной. Если я изменю имя родителя, я должен также переписать его дочерние элементы. Чувствует себя неправильно. Есть идеи получше???