0

私はこの問題についていくつかの調査を行ってきました.couchdbはドキュメントの競合が多すぎます.

私は、nano で CouchDB ドキュメントを更新するという解決策を見てきました。

  1. ドキュメントを取得
  2. _rev を保存する
  3. 変更を適用する
  4. 保存された _rev で更新されたドキュメントを送信してみてください
  5. 409 の場合は手順 1 に進みます

そして、最後のステップまで、それを行う関数を作成しようとしました:

nano_update = function ( data, id, callback ) {

    var db = this;

    db.get( id, function( err, doc ) { //Get _rev of the document

        if ( !err ) {
            for ( var k in data ) {
                //Replace defined information while keeping the other
                if ( k.toLowerCase() !== '_rev' ) //Do not override _rev
                    doc[ k ] = data[ k ];
            }

        return db.insert( doc, id, callback ); //Insert with _rev to update
        }
    });
}

//Call it
var database = nano.use( 'databaseName' );
nano_update.call( database, { counter: Math.random() }, 'documentName' );

これは私の予想に近いものですが、2 つのウィンドウを開いて同じリクエストを連続して行うと、2 つのドキュメントが競合してサーバーがクラッシュするポイントに到達します。

ですから、'5. 409' の場合は手順 1 に進みます。同じ関数を再帰的に呼び出す必要があるということですか? ドキュメントが競合し続けると、間違いなく無限ループになり、サーバーが再びクラッシュするだけです。現在、私がやっていることは、5 秒ごとに 1 つ以上のリクエストを許可しないことですが、将来的にはうまくいきません。

nodejsでnanoを使用して、409の競合するCouchDBドキュメントを正しく処理するにはどうすればよいですか?

4

1 に答える 1

1

409 が表示される理由は、_revドキュメントが更新されるたびに変更されるため、 が古くなっているためです。だから、に固執しないでください_rev

複数のドキュメントを更新する必要がある場合は、Bulk Document APIを使用するか、 Partial Updateを使用できます。これは、 を指定せずにドキュメントを更新するハックのようなものです(データベースから を_rev自動的に読み取ります)。_rev

于 2014-08-25T07:50:50.803 に答える