Filter CouchDB过滤复制

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

在尝试复制过滤器时,我偶然发现了一个问题。 当我的过滤器作为_replicator数据库中的一个条目工作时,我在使用cURL时不会这样做

设计文档中的过滤器为:

{
    "_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个的文档失败
  • 在任何其他情况下,文档都会通过
这听起来可能是一个不正确的策略。重申此策略的另一种方法是“附件超过1024个的文档失败,其他所有内容都通过”。然而,由于您编写了这么多代码,我怀疑我的摘要不是真正的策略

另一个简短的提示,关于什么看起来像一个bug。给出:

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以及我没有粘贴的其他标准。