1

プロジェクトの1つでcouchdb.mappingを使用しています。必要なすべてのフィールドを含むSupportCase派生元というクラスがあります。Document

私のデータベース(と呼ばれるadmin)には、複数のドキュメントタイプが含まれています。typeすべてのドキュメントに、それらを区別するために使用するフィールドがあります。"case"ビューを使用して取得したいタイプのドキュメントがたくさんあります。supportと呼ばれるその中のビューで呼ばれる設計ドキュメントがありますcases。を使用してこのビューの結果を要求すると、必要なものが含まれているのdb.view("support/cases)リストが返さRowれます。

SupportCaseただし、1つの関数を呼び出して、システム内のすべてのリストを取得できるように、これをクラスでラップする必要がSupportCaseあります。ViewFieldプロパティを作成しました

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

さて、電話するとSupportCase.all(db)、すべてのケースが返されます。

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

4

3 に答える 3

3

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

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

Documentviewclassには、呼び出されたクラスごとに行をラップするclassmethodがあります。ViewResultしたがって、以下はタイプの行を含むaを返し、それ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

于 2011-06-27T23:58:05.737 に答える
0

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

これはかなり良い要約を持っています

于 2011-05-04T12:44:07.470 に答える
0

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

于 2011-06-27T15:09:27.967 に答える