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からすべてのChildrenドキュメントをプルして検索する必要があることを意味します。親データ(またはそのサブセット)を子ドキュメントに書き込む方が賢明なので、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'})]
したがって、検索はより効率的ですが、Childオブジェクトを最新の状態に保つ必要があることは、苦痛で危険な場合があると思います。親の名前を変更すると、その子も書き直す必要があります。気分が悪い。より良いアイデアはありますか?