我使用python库来使用连续提要收听数据库中的更改。我想应用一个过滤器,它只给我提供一个键read等于true的文档。
对于正常的HTTP请求,我得到了所需的结果。但我无法通过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中使用这个过滤器并不是个好主意。)
有人能给我指点我做错了什么/怎么做?
发布于 2017-01-07 13:04:38
我想出来了。我在数据库中创建了一个设计文档,在该文档中,我希望过滤以下内容:
{
"_id": "_design/read_validator",
"_rev": "1-bd5fb337899a0eaf485b2112b439cc30",
"filters": {
"read_only_true": "function(doc, req) {if(doc.read === true) {return true;}return false;}"
}
}这里,read_validator是一个设计文档,它包含要返回docs的过滤器,该过滤器将read属性设置为true。在couchdb客户机中,在获取连续提要时,我将过滤器资源路径作为字符串design_document_name/filter_name,其中design_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_changes将是一个连续的提要生成器,通过它可以通过迭代获取所有文档,其中的read键等于true。
https://stackoverflow.com/questions/41503606
复制相似问题