1

私は python-couchdb ライブラリを使用して、継続的なフィードを使用してデータベースの変更をリッスンしています。readに等しいキーを持つドキュメントのみを提供するフィルターを適用したいと考えていますtrue

通常の HTTP GET リクエストでは、目的の結果が得られます。couchdb-pythonしかし、ライブラリを介してこれを行う方法を理解できません。これが私が書いたカスタムフィルターです:

def read_true_filter():
    return """function(doc, req) {
            if(doc.read === true) {
                return true;
            }
            return false;
        }
        """

変更をリッスンしようとしている方法は次のとおりです。

db_changes = db.changes(
    feed='continuous',
    include_docs=True,
    heartbeat=1000,
    since=last_seq_id,
    filter=read_true_filter
)

しかし、これは私にエラーを与えます:

Traceback (most recent call last):
  File "../src/couch_pull_pipeline.py", line 87, in <module>
    db_changes = db.changes(
  File "/Users/sanyam/venv/lib/python3.5/site-packages/couchdb/client.py", line 1027, in _changes
    _, _, data = self.resource.get('_changes', **opts)
  File "/Users/sanyam/venv/lib/python3.5/site-packages/couchdb/http.py", line 546, in get
    return self._request('GET', path, headers=headers, **params)
  File "/Users/sanyam/venv/lib/python3.5/site-packages/couchdb/http.py", line 581, in _request
    credentials=self.credentials)
  File "/Users/sanyam/venv/lib/python3.5/site-packages/couchdb/http.py", line 421, in request
    raise ServerError((status, error))
couchdb.http.ServerError: (400, ('bad_request', 'filter parameter must be of the form `designname/filtername`'))

リクエストに追加designnameするのは簡単ですが、couchdb クライアントを使用してこれを行うのと同等のものを見つけることができませんでした。

Pythonライブラリを使用することは可能ですか、それとも単純なHTTPリクエストを使用する必要がありますか、それともcouchdbサーバー自体にフィルターを設定することをお勧めしますか? (私がこれまでに読んだことによると、パフォーマンス上の理由から、そのフィルターをcouchdbに置くことはお勧めできません。)

誰かが私が間違っていること/それをどのように行うかについてのポインタを提供できますか?

4

1 に答える 1

1

私はこれを理解しました。次のようにコンテンツをフィルタリングしたいデータベースで設計ドキュメントを作成しました。

{
   "_id": "_design/read_validator",
   "_rev": "1-bd5fb337899a0eaf485b2112b439cc30",
   "filters": {
       "read_only_true": "function(doc, req) {if(doc.read === true) {return true;}return false;}"
   }
}

以下は、属性が に設定された、返されるread_validatorフィルタを含むデザイン ドキュメントです。連続フィードを取得しているときに、couchdb python クライアントでフィルター リソース パスを文字列として指定しました。です)。したがって、接続は次のようになります。docsreadtruedesign_document_name/filter_namedesign_documentread_validatorfilter_nameread_only_true

db_changes = db.changes(
    feed='continuous',
    include_docs=True,
    heartbeat=1000,
    since=last_seq_id,
    filter="read_validator/read_only_true"
)

これは、 に等しいキーdb_changesを持つすべてのドキュメントを繰り返し取得できる継続的なフィード ジェネレーターです。readtrue

于 2017-01-07T13:04:38.253 に答える