質問

私が使用しているのは、 カウチデータベースマッピング 私のプロジェクトの1つで。というクラスがあります SupportCase に由来する Document これには必要なフィールドがすべて含まれています。

私のデータベース(と呼ばれる) admin) には複数のドキュメント タイプが含まれています。私は持っています type すべての文書のフィールドを区別するために使用します。タイプの書類がたくさんあります "case" これはビューを使用して取得したいと思います。という設計文書があります support 内部のビューを次のように呼びます cases. 。次を使用してこのビューの結果をリクエストすると、 db.view("support/cases), 、リストが返されます。 Row私が欲しいものを持っています。

ただし、これを何とかしてラップしたいのですが、 SupportCase クラスを使用して、単一の関数を呼び出してすべての関数のリストを取得できます。 SupportCaseシステム内にあります。私が作成したのは、 ViewField 財産

@ViewField.define('cases')
def all(self, doc):
    if doc.get("type","") == "case":
        yield doc["_id"], doc

今、私が電話したら SupportCase.all(db), すべてのケースを返します。

私が理解できないのは、このビューが事前に計算されてデータベースに保存されているのか、それとも次のようにオンデマンドで実行されるのかということです。 db.query. 。後者の場合、処理が遅くなるため、事前計算されたビューを使用したいと考えています。それ、どうやったら出来るの?

役に立ちましたか?

解決

必要なものは次のとおりだと思います:

@classmethod
def all(cls):
    result = cls.view(db, "support/all", include_docs=True)
    return result.rows

Document クラスにはクラスメソッドがあります view これは、呼び出されたクラスごとに行をラップします。したがって、次のようにすると、 ViewResult タイプの行を含む SupportCase そして取っています .rows サポートケースのリストが表示されます。

SupportCase.view(db, viewname, include_docs=True)

ViewField の魔法を使う必要はないと思います。しかし、それがどのように機能するかを説明しましょう。次の例を考えてみましょう。 CouchDB-python ドキュメンテーション。

class Person(Document):
     @ViewField.define('people')
     def by_name(doc):
         yield doc['name'], doc

これは次と同等だと思います。

class Person(Document):
    @classmethod
    def by_name(cls, db, **kw):
        return cls.view(db, **kw)

オリジナル機能を搭載 People.by_name.map_fun.

他のヒント

map関数は、いくつかの点でリレーショナルデータベースのインデックスに類似しています。毎回再実行されるわけではなく、新しいドキュメントが更新された方法で追加されたときに、すべてをやり直す必要はありません(一種のツリー構造です)。

これにはかなり良い概要 があります

ViewFieldは事前定義されたビューを使用するため、一度構築すると高速になります。一時的なビューは絶対に使用しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top