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 回答