1

CouchDB ドキュメントのフィールドをループして、フィールドの古いバージョンと新しいバージョンが同じであることを確認しようとしています (validate_doc_update の一部として)。ただし、次のようなことを言う代わりに、「ドキュメントの foreach フィールド、それらが同じであることを確認してください」と同等のことをしたいと思います

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

何とか何とか。CouchDB フィールドでこれを行う方法はありますか、または各フィールドの名前を指定する必要がありますか? それらをすべて入力する必要はなく、フィールド名を変更した場合でも、戻って微調整する必要がないようにすることをお勧めします。

4

2 に答える 2

1

JSfor inループで十分です。

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

ここで注意する必要があることが 1 つあります。それは、リビジョン間でフィールドを削除/追加すると、検証が難しくなる可能性があるということです。

SpiderMonkey で利用できると確信しているObject.keysので、古いものと新しいもののキーの数を比較するためにそれを使用する必要があるかもしれません。

于 2012-08-15T17:59:54.940 に答える
1

として渡される値newDoc、および関数oldDocへのパラメーターは Javascript オブジェクトです。JS オブジェクトを比較するように、2 つのドキュメントを比較します。「CouchDBフィールド」はありません。validate_doc_update

カスタム コードを記述したり、 Underscore.jsなどの JS ライブラリを使用したりできます。CommonJS モジュールとして含めることができます。問題は_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...
  }
}
于 2012-08-17T19:26:27.960 に答える