1

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

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

呸呸呸。有没有办法用 CouchDB 字段做到这一点,还是我必须指定每个字段的名称?最好不要全部输入,如果我们更改了字段名称,就不必重新输入并进行调整。

4

2 回答 2

1

The values passed as newDoc, and oldDoc parameters to validate_doc_update function are Javascript objects: you compare two documents as you compare any JS objects. There no "CouchDB field".

You can write custom code, or you can use a JS library like Underscore.js. You can include it as a CommonJS module. The only problem is the _rev field. My approach is to keep CouchDB metadata separate from document data, by putting the data in a data field. For example:

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

becomes

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

Then the comparison can be done with

function(newDoc, oldDoc) {
  var _ = require("underscore");
  if (!_.isEqual(newDoc.data, oldDoc.data)) {
    // something changed...
  }
}
于 2012-08-17T19:26:27.960 回答
1

一个 JSfor in循环就足够了:

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

在这里您需要注意一件事,那就是在修订之间删除/添加字段可能更难验证。

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

于 2012-08-15T17:59:54.940 回答