循环遍历文档中的CouchDB字段(validate_doc_update)

时间:2012-08-15 17:11:26

标签: javascript validation couchdb

我正在尝试遍历CouchDB文档中的字段,并检查该字段的旧版本和新版本是否相同(作为我的validate_doc_update的一部分)。但是,我想做相当于“文件中的foreach字段,检查以确保它们是相同的”,而不是像

那样说
oldrev.document.field1 == newrev.document.field1, oldrev.document.field2 == newrev.document.field2, 
等等等等等等。有办法吗? 要使用CouchDB字段执行此操作,还是必须指定每个字段的名称?如果我们不改变字段名称,就不必重新进入并调整内容,这将是一件好事。

2 个答案:

答案 0 :(得分:1)

JS for in循环应该足够了:

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

有一件事你需要在这里保持谨慎,那就是在修订版之间删除/添加字段可能更难以验证。

我很确定SpiderMonkey可以使用Object.keys,因此您可能需要使用它来比较新旧密钥的数量。

答案 1 :(得分:1)

作为newDocoldDoc参数传递给validate_doc_update function的值是Javascript对象:在比较任何JS对象时比较两个文档。没有“CouchDB字段”。

您可以编写自定义代码,也可以使用像Underscore.js这样的JS库。你可以include it as a CommonJS module。唯一的问题是_rev字段。我的方法是将CouchDB元数据与文档数据分开,方法是将数据放在data字段中。例如:

{ "_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...
  }
}