2012-08-15 49 views
1

我想循環遍歷CouchDB文檔中的字段,並檢查舊版本的字段和新版本是否相同(作爲我的validate_doc_update的一部分)。然而,我願做一個相當於「的foreach領域的文件,檢查以確保它們是相同的」,而不必說,像循環遍歷文檔中的CouchDB字段(validate_doc_update)

oldrev.document.field1 == newrev.document.field1, oldrev.document.field2 == newrev.document.field2, 

等等等等。有沒有一種方法 與CouchDB字段做到這一點,還是我必須指定每個字段的名稱?如果我們不改變字段名稱,不必重新輸入並調整內容,這將是很好的。

回答

1

一個JS for in循環應該足夠了:

for (var key in newrev) { 
    if (newrev.hasOwnProperty(key) { 
     if (oldrev[key] === newrev[key]) { 
      // they are the same 
     } 
    } 
} 

有一件事你需要謹慎這裏,那就是修訂版之間刪除/添加字段可能難以驗證。

我很確定Object.keys可用於SpiderMonkey,因此您可能需要使用它來比較新舊版本之間的密鑰數量。

1

作爲newDocoldDoc參數傳遞給validate_doc_update function的參數是Javascript對象:在比較任何JS對象時比較兩個文檔。沒有「CouchDB字段」。

您可以編寫自定義代碼,也可以使用JS庫,如Underscore.js。你可以include it as a CommonJS module。唯一的問題是_rev字段。我的方法是通過將數據放在data字段中,將CouchDB元數據與文檔數據分開。例如:

{ "_id": "ID", "_rev": "REV", "foo": "bar", "baz": [1, 2] } 

變得

{ "_id": "ID", "_rev": "REV", "data": { "foo": "bar", "baz": [1, 2] } } 

然後比較可以與

function(newDoc, oldDoc) { 
    var _ = require("underscore"); 
    if (!_.isEqual(newDoc.data, oldDoc.data)) { 
    // something changed... 
    } 
} 
來完成