1

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オブジェクトを最新の状態に保つ必要があることは、苦痛で危険な場合があると思います。親の名前を変更すると、その子も書き直す必要があります。気分が悪い。より良いアイデアはありますか?

4

1 に答える 1

2

すべて をロードする必要はありませんChildren

parent_ids = db.Parents.find({'name': 'foo'}).distinct('_id')
children = db.Children.find({'parent': {'$in': parent_ids}})

(また、なぜchild親のフィールドparent子のフィールドの両方があるのですか?)

于 2012-08-14T06:51:00.410 に答える