如何在 python couchdb 中获取过滤后的更改
How to get filtered changes in python couchdb
我正在使用 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 中使用该过滤器并不是一个好主意。)
有人可以指导我做错了什么/如何解决吗?
我想通了。我在数据库中制作了一个设计文档,我想在其中过滤内容:
{
"_id": "_design/read_validator",
"_rev": "1-bd5fb337899a0eaf485b2112b439cc30",
"filters": {
"read_only_true": "function(doc, req) {if(doc.read === true) {return true;}return false;}"
}
}
此处 read_validator
是包含 return docs
过滤器的设计文档,其中 read
属性设置为 true
。在 couchdb python 客户端中,在获得连续提要的同时,我将过滤器资源路径作为字符串 design_document_name/filter_name
,其中 design_document
是在数据库中创建的设计文档的名称(在本例中为是 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
.
我正在使用 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 中使用该过滤器并不是一个好主意。)
有人可以指导我做错了什么/如何解决吗?
我想通了。我在数据库中制作了一个设计文档,我想在其中过滤内容:
{
"_id": "_design/read_validator",
"_rev": "1-bd5fb337899a0eaf485b2112b439cc30",
"filters": {
"read_only_true": "function(doc, req) {if(doc.read === true) {return true;}return false;}"
}
}
此处 read_validator
是包含 return docs
过滤器的设计文档,其中 read
属性设置为 true
。在 couchdb python 客户端中,在获得连续提要的同时,我将过滤器资源路径作为字符串 design_document_name/filter_name
,其中 design_document
是在数据库中创建的设计文档的名称(在本例中为是 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
.