couchdb-pythons ViewField のマップ関数の意味
-
28-10-2019 - |
質問
私が使用しているのは、 カウチデータベースマッピング 私のプロジェクトの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は事前定義されたビューを使用するため、一度構築すると高速になります。一時的なビューは絶対に使用しません。