假设在node.js上通过nano打开了一个couchdb会话
var dbserv = require('nano')('http://localhost:5984');
在couchdb服务器dbserv
可以访问的情况下,有一个数据库users
,其用户的字段groups
是一个数组。
如果我想更新groups
中用户jim
的{{1}},如何在不替换整个文档的情况下这样做?
答案 0 :(得分:3)
要创建更新处理程序,请编写设计文档:
{
"_id": "_design/yourapp",
"updates": {
"foo": "function(doc, req) {
doc.groups.push(req.query.bar); // or do whatever you like with it
return [doc, 'done'];
}"
}
}
并将其放在您的数据库_design/yourapp
的数据库中,然后像这样获取它:
http://localhost:5984/users/_design/yourapp/_update/foo/jim?bar=baz
var dbserv = require('nano')('http://localhost:5984');
var db = dbserv.use('users');
var designdoc = {/* The above design document */};
db.insert(designdoc);
db.get('_design/yourapp/_update/foo/jim', {bar: 'baz'});
请注意,您只需插入一次设计文档,甚至可以使用curl
手动执行,然后更新您的文档,只需按照上述说明发出GET请求。
免责声明:未经测试,之前我从未使用过nano,但它应该与您必须做的事情保持一致。
答案 1 :(得分:3)
找到了一种更新的方法,没有所有_design需求等。 Nano CouchDB的问题在于插件实际上并没有提供发送更新所需的正确_rev的位置。 无论如何,有一个解决方法。 需要做的是从要更新的_id中获取_rev值。 因此,您使用Nano db.get作为大函数,获取_rev值并更新您的文档。 这是一个代码示例:
users.get('document_name', function(err, doc) {
updaterev = doc._rev;
users.insert({title:'here_ya_go',_rev:updaterev},'document_name', function(err, body , header) {
if (!err)
{
console.log(body);
res.send('update website succeed');
}
else
{
console.log(err.error);
}
});
});
当db.insert函数在db.get函数中时,它让我们有机会抓住_rev并更新文档。
我知道,我可能没有发明这一点,但重要的是让这段代码能够抓住并继续前进。 祝你好运。