我将以下格式的一些基于语言环境的数据存储在CouchDB中。
{
"_id": "a62f81b5afad1857c2f6399db500c73b",
"_rev": "3-923e5ed468e0f617f09057035b41051a",
"type": "CAT",
"origin_id": "1",
"locale": "ar",
"values_translation": {
"id": "ar",
"title": ""
}
}
我使用Nano作为Node JS应用程序中的客户端,我需要使用Update Handler插入(如果不存在)/ update(如果存在)文档。为此,我在ouchDB中创建了以下文档;
"_id": "_design/handler",
"_rev": "36-d2d08a0a822a762ac07faa4042eca5a0",
"updates": {
"handler": "function(doc, req){
if (doc.type === req.type && doc.origin_id === req.origin_id && doc.locale === req.locale)
{ return [doc, 'OK'];}
else { return [null, 'KO']; }
}"
},
"language": "javascript"
}
但是当我使用以下Nano方法运行它时,
translationsDB.atomic("handler", "handler", "_design/handler",
{ type, origin_id, locale, values_translation: value }).then((response) => {
console.log(response);
}).catch(err => {
console.log(err);
});
即使我传递无效数据,它也始终返回'OK'
。
对于真实数据,它将返回OK
,但不会更新文档。
需要弄清楚如何以正确的方式实现这一目标(如果文档已存在,则进行更新;如果文档是新文档,则进行插入)。
答案 0 :(得分:2)
对于locale
和undefined
,您的doc
之类的自定义字段名称都是req
,因为:
doc.customfield ,atomic("handler", "handler", "_design/handler"
调用设计文档本身的设计(3rd parameter to atomic是要更新的文档)并且您的设计文档自然缺少您放置在示例区域设置文档中的自定义字段。
req.customfield ,它们是不存在的req字段,原子传递的字段位于原子req.body
中的JSON中,如原子文档中所示。
因此,假设undefined === undefined
为真,则您的检查始终会通过这些字段。
然后:
{ return [doc, 'OK'];}
因此,ouchdb保存了未更改的设计文档(问题1),仅导致其_rev
不断上涨:
{“ _id”:“ _design / handler”,“ _rev”:“ 36 -...
但这是错误的文档,并且没有任何字段被更改。
在正确的文档上调用它:
translationsDB.atomic("handler", "handler", "a62f81b5afad1857c2f6399db500c73b",
从请求正文中提取自定义字段:
var reqb = JSON.parse(req.body);
if (doc.type === reqb.type && doc.origin_id === reqb.origin_id && doc.locale === reqb.locale)
对要返回的文档进行一些修改:
{ return [Object.assign({}, doc, reqb), 'OK'];}