我有一些大型但逻辑上有组织的文档 - 并且只想对单个文档的子部分进行更新。
鉴于这个简单的文件:
_id: 123456,
_rev: 3242342,
name: 'Stephen',
type: 'Person',
hobbies: [ 'sky-diving' ]
在我的应用程序中,我可能有一个 addHobbies 方法,该方法将使用刚刚检索的视图:
_id: 123456,
_rev: 3242342,
hobbies: [ 'sky-diving' ]
这样它就可以为hobbies
数组添加额外的爱好,然后PUT
将这个数据子集添加回文档。
据我了解,CouchDB [1.2]不允许这样的部分更新,因此我认为有必要在保存操作期间获取整个文档,合并我的更改,然后PUT
完整记录每一次保存。
答案 0 :(得分:4)
你是对的。也就是说,实际上,文档数据库意味着:签出和签到。
您可以创建(或使用)填充码来模拟您想要的内容,让您专注于重要部分。在服务器端,您可以使用update functions。
客户端有很多解决方案。
cradle.js将使用合并方法为您提供假部分更新。
如果您只想更新一个或多个属性,并保持其他属性不变,则可以使用merge()方法:
db.merge('luke', {jedi: true}, function (err, res) {
// Luke is now a jedi,
// but remains on the dark side of the force.
});
https://github.com/cloudhead/cradle/
相关,Node.js也是Transaction,用于在CouchDB文档上执行任意原子事务。
答案 1 :(得分:0)
我想说摇篮当前缺少真正的部分更新功能,它还支持更新字段值的JSON数据中的键的路径,如Apache演示here,而不仅限于更新文档中的单个键,如db.merge方法。
事实上,在查看底座源代码时,我发现有一个Database.prototype.update方法(在lib / cradle / document.js中),但是这个方法似乎没有记录。
这将是优雅的,这可以成为摇篮的一个组成部分,消除了仅为部分更新单独请求CouchDB视图更新的需要。