2017-01-06 6 views
1

私はpython-couchdbライブラリを使用して、連続フィードを使用してデータベースの変更を監視しています。私は、readと等しいキーを持つ文書のみを与えるフィルタを適用したいと考えています。trueです。python couchdbでフィルタリングされた変更を取得するには

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

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

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

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

をここでは、私は変化を聞くしようとしている方法です

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にそのフィルタを置くのは良い考えではありません)。

私が間違っていることについて/それ?

答えて

1

私はこれを理解しました。ここで

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

read_validatortrueに設定read属性を持っているdocsを返すようにフィルタを含む設計文書である:私は私のような内容をフィルタリングしたかったデータベース内の設計文書が作られました。 couchdb pythonクライアントでは、連続フィードを取得するときに、フィルタリソースパスを文字列として指定しましたdesign_document_name/filter_namedesign_documentはdb(この場合はread_validator)で作成された設計ドキュメントの名前で、filter_nameはフィルタの名前ですこの場合はread_only_trueです)。だから、接続はこのようなものです:

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

db_changestrueに等しいキーreadを持っているすべてのドキュメントを反復処理によって取り出すことができ、それを通して連続供給ジェネレータ、だろう。

関連する問題