Filter CouchDB过滤复制
在尝试复制过滤器时,我偶然发现了一个问题。 当我的过滤器作为_replicator数据库中的一个条目工作时,我在使用cURL时不会这样做 设计文档中的过滤器为:Filter CouchDB过滤复制,filter,couchdb,replication,Filter,Couchdb,Replication,在尝试复制过滤器时,我偶然发现了一个问题。 当我的过滤器作为_replicator数据库中的一个条目工作时,我在使用cURL时不会这样做 设计文档中的过滤器为: { "_id": "_design/partial", "filters": { "mobile": "function(doc, req) { if (doc._attachments) { var result = new Boolean(tr
{
"_id": "_design/partial",
"filters": {
"mobile": "function(doc, req) {
if (doc._attachments) {
var result = new Boolean(true);
for (attachment in doc._attachments) {
if (attachment.content_type == 'image/jpeg') {
return true;
}
if (doc._attachments.length > 1024) {
result = false;
}
}
return result;
} else {
return true;
}
}"
}
}
卷曲线:
curl-X POST\u replicate-d'{\“source\”:“http://admin:pass@192.168.2:5984/docs2\“,”目标\“:”docs2\u部分\“,”过滤器\“:”部分/移动\“,”创建\u目标\“:true}'-H“内容类型:应用程序/json”
我在目标和源上创建了_design/partial文档,但所有文档都在复制中。即使是一个附加的二进制文件大于1MB。
感谢您的帮助
答复是:
{"ok":true,"session_id":"833ff96d21278a24532d116f57c45f31","source_last_seq":32,"replication_id_version":2,"history":[{"session_id":"833ff96d21278a24532d116f57c45f31","start_time":"Wed, 17 Aug 2011 21:43:46 GMT","end_time":"Wed, 17 Aug 2011 21:44:22 GMT","start_last_seq":0,"end_last_seq":32,"recorded_seq":32,"missing_checked":0,"missing_found":28,"docs_read":28,"docs_written":28,"doc_write_failures":0}]}
使用“代替\”或“代替\”的结果是:
{"error":"bad_request","reason":"invalid UTF-8 JSON: [...]}
curl(即CouchDB)的输出是什么 从你的例子中,我的第一个猜测是你有一个引用错误。在单引号中,你不需要转义双引号。尝试删除所有这些反斜杠。会发生什么
如果您在Windows上,单引号在shell中无效。在这种情况下,保留反斜杠,只需将单引号更改为双引号。现在,我认为您的筛选函数的逻辑可能只是有一个bug。以下是我如何阅读您的筛选策略:
- 所有没有附件的文档都通过
- 具有
附件传递的所有文档图像/jpeg
- 附件超过1024个的文档失败
- 在任何其他情况下,文档都会通过
for (attachment in doc._attachments) { /* ... */ }
attachment
变量将是“index.html”或“me.jpeg”之类的内容,即文件名。要获取附件内容类型,您需要:
var type;
// This is WRONG
type = attachment.content_type; // type set to undefined
// This is RIGHT
type = doc._attachments[attachment].content_type; // type set to "text/html" etc.
为了避免此错误,您可以更改代码以使事情更清楚:
for (attachment_filename in doc._attachments) { /* ... */ }
下一步,
doc.\u attachments.length
将告诉您文档中的附件数量,而不是当前附件的长度。奇怪的是,您在循环中进行了测试,因为表达式永远不会更改。您是否尝试改为测试附件大小?谢谢您的回复,我已经添加了信息回复到原来的帖子。好的,第一个回复表示没有语法错误。我没有意识到单引号在Windows中是有效的。我总是做双引号,然后转义其中所有的双引号。无论如何,继续新想法。谢谢!将其改为doc.\u附件[附件].content\u type
和doc.\u attachments[attachment].length
起了作用。但仅供参考,还有更多的逻辑,比如允许任何长度的JPEG以及我没有粘贴的其他标准。