CouchDB部分/差分写入

时间:2012-05-13 08:58:47

标签: node.js couchdb express

基本问题

我有一些大型但逻辑上有组织的文档 - 并且只想对单个文档的子部分进行更新。

实施例

鉴于这个简单的文件:

_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 完整记录每一次保存。

  • 有没有其他方法可以做到这一点(我对CouchDB的功能有误吗?)
  • 是否有任何库(我在node.js上使用express)来处理这种操作?

2 个答案:

答案 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视图更新的需要。