我正在尝试遍历CouchDB文档中的字段,并检查该字段的旧版本和新版本是否相同(作为我的validate_doc_update的一部分)。但是,我想做相当于“文件中的foreach字段,检查以确保它们是相同的”,而不是像
那样说oldrev.document.field1 == newrev.document.field1, oldrev.document.field2 == newrev.document.field2,
等等等等等等。有办法吗?
要使用CouchDB字段执行此操作,还是必须指定每个字段的名称?如果我们不改变字段名称,就不必重新进入并调整内容,这将是一件好事。
答案 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)
作为newDoc
和oldDoc
参数传递给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...
}
}