2017-08-11 68 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,但不与嵌套对象,如

"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]的通用过程,但我想 这可能还需要不同的设计修改。

理想情况下,如果可能的话,希望至少在上述三种情况下起作用的东西,只要它不太复杂就不值得 的努力。

有人可能会很好地帮助这里或请转到我的一些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

Hi @Alexis。谢谢你。很抱歉打扰你。运行更新时出现以下错误:'{“error”:“render_error”,“reason”:“function raised error:(new TypeError(\”Object.assign is not a function \“'这是否表示任何I我做了一个错误的对话 – jlb333333