CouchDB过滤复制

时间:2011-08-17 01:18:35

标签: filter couchdb replication

尝试使用过滤器进行复制,我偶然发现了一个问题。 虽然我的过滤器在_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专栏:

curl -X POST http://admin:pass@192.168.178.13:5985/_replicate -d '{\"source\":\"http://admin:pass@192.168.2:5984/docs2\",\"target\":\"docs2_partial\",\"filter\":\"partial/mobile\",\"create_target\":true}' -H "Content-Type: application/json"

我在目标和源上创建了_design / partial文档,但所有文档都在被复制。即使附加二进制大于1 MB的那个。 任何帮助表示赞赏!

cURL回复是:

{"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: [...]}

2 个答案:

答案 0 :(得分:8)

现在我想也许你的过滤器功能的逻辑只是有一个bug。以下是我阅读过滤政策的方法:

  • 所有没有附件的文档都会通过
  • 所有拥有image/jpeg附件的文档
  • 超过1,024个附件的文档失败
  • 在任何其他情况下,文档都会通过

这听起来似乎是一个不正确的政策。重申此政策的另一种方法是“超过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._attachments.length会告诉您文档中的附件数量,而不是当前附件的长度。你在循环中测试它是很奇怪的,因为表达式永远不会改变。您是否尝试测试附件尺寸

答案 1 :(得分:0)

curl的输出是什么(即来自CouchDB)?

从您的示例中,我的第一个猜测是您有引用错误。在单引号内,您不需要转义双引号。尝试删除所有这些反斜杠。会发生什么?

如果您使用的是Windows,则单引号在shell中无效。在这种情况下,请保留反斜杠,然后将单引号更改为双引号。