2011-08-17 122 views
5

嘗試用於複製的篩選器時,我偶然發現了一個問題。 雖然我的過濾器是作爲_replicator數據庫中的條目工作的,但我在使用cURL時沒有這樣做。CouchDB篩選複製

設計文檔中的過濾器是:

{ 
    "_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 http://admin:[email protected]:5985/ _replicate -d '{\"source\":\"http://admin:[email protected]:5984/docs2\",\"target\":\"docs2_partial\",\"filter\":\"partial/mobile\",\"create_target\":true}' -H "Content-Type: application/json"

我創建_design兩個目標和源/部分的文件,但是所有文件被複制。即使是附帶大於1 MB的二進制文件。 任何幫助表示讚賞!

捲曲回覆是:

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

回答

8

現在我想可能你的過濾函數的邏輯只是有一個bug。這裏是我看了你的過濾策略:

  • 所有文檔有沒有附件通過
  • 所有文檔有一個image/jpeg附件傳遞
  • 文檔與超過1024個附件失敗
  • 在任何其他情況下,該文檔通過

聽起來或許不正確的政策。重申這一政策的另一種方式是「擁有超過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._attachments.length會告訴你的數量文檔中的附件,例如當前附件的長度。在循環內測試它是很奇怪的,因爲表達式永遠不會改變。您是否想要測試附件大小而不是?

+0

謝謝!將它更改爲'doc._attachments [attachment] .content_type'和'doc._attachments [attachment] .length'就行了。但是,邏輯還有更多,比如允許任何長度的jpegs和我沒有粘貼的更多標準。 – degeeman

0

什麼是從捲曲的輸出(即,從CouchDB的) ?

從你的例子中,我的第一個猜測是你有一個引用錯誤,在單引號裏面,你不需要轉義雙引號,嘗試刪除所有的反斜槓,會發生什麼?

如果您在Windows上,則單引號在shell中無效。在這種情況下,請保留反斜槓,並將單引號改爲雙引號。

+0

感謝您的回覆,我已將信息添加到原始帖子中。 – degeeman

+0

btw。我在Windows上,嘗試了cmd和PowerShell – degeeman

+0

好的,第一個響應意味着沒有語法錯誤。我沒有意識到單引號在Windows中是有效的。我總是做雙引號,然後在裏面跳出我所有的雙引號。無論如何,繼續新的想法。 – JasonSmith