1

私はcouchDBでnanoを使用しており、ドキュメントを簡単に更新して新しいフィールドを追加しようとしています。たとえば、fooというドキュメントがあるとします。現在、その中の唯一のフィールドは'bar'であり、いくつかの値があります。次に、最後に投稿するコードを使用してdb.insertを実行しようとしますが、両方のフィールドを使用する代わりに、barを消去し、代わりに新しいフィールドを使用します。どうすればこれを修正できますか?

私が使用しているコード:

    dB.get('foo', function(err, body) {
        if (!err){

            if(typeof body.qwax === 'undefined'){
                dB.insert({qwax : [data], "_rev" : body._rev}, 'foo', function(err, body, header) {
                    if (err) {
                        console.log(err.message);
                        return;
                    }
                });
            }
            else{
                body.qwax.push(data);
                dB.insert({qwax : body.qwax, "_rev" : body._rev}, 'foo', function(err, body, header) {
                  if (err) {
                    console.log(err.message);
                    return;
                  }

                });
            }
        }
        else{console.log(err);}
    });

データが他の場所で定義されている場所。

4

3 に答える 3

2

nano には、設計ドキュメントで特定の更新関数を呼び出すために呼び出すことができるアトミック関数があります: https://github.com/dscape/nano#dbatomicdesignname-updatename-docname-body-callback

ドキュメントに記載されている使用例は次のとおりです: https://github.com/dscape/nano/blob/master/tests/design/atomic.js

たとえば、次の update 属性を _foo デザイン ドキュメントに作成できます。

updates: {
        setBar: function (doc, req) {
          var body = JSON.parse(req.body);
          doc.bar = body.bar;
          return [doc, 'OK'];
        }

次に、次のように nano を使用して、この setBar update 関数を呼び出します。

db.atomic('_foo', 'setBar', your_foo_document_id, { bar: barvalue }, function (err, headers) {
    if (err) {
      return callback(err);
    }
    ... rest of your code
于 2012-12-21T10:44:11.137 に答える
0

そのための設計ドキュメントで更新ハンドラーwiki )を使用できます。JS関数を作成するだけで、ドキュメント全体を再度送信する代わりに、この関数を呼び出すと、「インプレース」で更新を行うことができます。

この関数は、更新するドキュメントとクライアントから提供されたデータの2つのパラメーターを取得し、更新されたドキュメントの新しいバージョンをHTTPヘッダーに返します。

于 2012-12-20T14:36:55.367 に答える
0

更新ごとに、ドキュメントに追加するフィールドだけでなく、ドキュメント全体を提供する必要があります。そのため、ドキュメントの現在のバージョンを取得し、それにファイルを追加してから、db update を実行する必要があります。

dB.insert({qwax : [data], "_rev" : body._rev, "bar" : body.bar}, 'foo', function(err, body, header) {
                if (err) {
                    console.log(err.message);
                    return;
                }
            });
于 2012-12-20T10:02:00.050 に答える