2017-08-11 4 views
0

一般的なドキュメントアップデートハンドラを作成しようとしています。CouchDBドキュメントアップデートハンドラ:Javascript

私が使用しています:

function(doc, req) {var field = req.query.field; var value = 
req.query.value; var message = 'set '+field+' to '+value; doc[field] = 
value; return [doc, message]; } 

これは単純なJSONで[OK]を動作しますが、このような

"abc":{"ax":"one", "by":"two" ...} 

としてネストされたオブジェクトと私のcurlコマンドがありません。

curl -X PUT 'http://127.0.0.1:5984/db/_design/updatehandler/_update/inplace/id?field=abc.ax&value=three' 

結果新しいフィールドが作成され、既存のabc:{ax:one}がそのまま残されます 。単純な例では

私が持っている場合:"xyz":"five"

curl -X PUT 'http://127.0.0.1:5984/db/_design/updatehandler/_update/inplace/id?field=xyz&value=ten' 

は...正常に動作します。

私はまだ"pqr":[s, t, u]で一般的なプロセスを試していませんが、私は と考えていますが、これには別のデザイン変更が必要な場合もあります。

可能であれば少なくとも上記の3つのケースで動作するものがほしいと思うのは、それほど複雑ではない限り、努力する価値があることではありません。

誰かがここで親切に助けてくれたり、いくつかのjavascriptの例を参照してください。

多くのありがとうございます。

ジョン

答えて

0

function (doc, req) { 
 
    function merge(nDoc,oDoc) { 
 
     for (var f in nDoc) { 
 
      var tmpNewDoc = nDoc[f], 
 
       tmpDoc = oDoc[f]; 
 
      var type = typeof(tmpNewDoc); 
 
      if (type === 'object' && tmpNewDoc.length === undefined && tmpDoc !== undefined) merge(tmpNewDoc, tmpDoc); 
 
      else oDoc[f] = tmpNewDoc; 
 
     } 
 
    } 
 
\t 
 
    if (!doc) { 
 
\t \t return [null, toJSON({ 
 
\t \t \t error: 'not_found', 
 
\t \t \t reason: 'No document were found with the specified ID or an incorrect method was used.' 
 
\t \t })]; 
 
\t } 
 
\t 
 
\t try { 
 
\t \t var newDoc = JSON.parse(req.body); 
 
\t \t merge(newDoc, doc); 
 
\t } 
 
\t 
 
\t catch (e) { 
 
\t \t return [null, ToJSON({ 
 
\t \t \t error: 'bad_request', 
 
\t \t \t reason: 'Invalid json or processing error' 
 
\t \t })]; 
 
\t } 
 
\t 
 
    return [doc, toJSON({ 
 
     doc: doc, 
 
     ok: true 
 
    })]; 
 
}" 
 
    }

は、単純にこのハンドラに新しい文書を渡します。それは新しい値をそれにマージします(警告、配列は上書きされます)。また、配列をマージしたい場合は、サードパーティライブラリを使用するか、独自の再帰的マージ機能を構築することができます。

+0

@Alexisありがとうございます。この場合、あなたはcurl POSTコマンドのようなものを提案していますか? – jlb333333

+0

[このドキュメントを参照](http://docs.couchdb.org/en/2.1.0/api/ddoc/render.html#post--db-_design-ddoc-_update-func) –

+0

こんにちは@Alexis。有難うございます。あなたを困らせて申し訳ありません。 '{" error ":" render_error "、" reason ":"関数がエラーを起こしました:(新しいTypeError(\ "Object.assignは関数ではありません\" ' – jlb333333