3

基本问题

我有一些大型但有逻辑组织的文档 - 并且希望仅对单个文档的子部分执行更新。

例子

鉴于这个简单的文件:

_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)来处理这种操作?
4

2 回答 2

4

你是对的。也就是说,实际上,文档数据库的含义是:签出和签入。

您可以创建(或使用)shim 代码来模拟您想要的,让您专注于重要部分。在服务器端,您可以使用更新功能

客户端有很多解决方案。

cradle.js 将使用 merge 方法为您提供虚假的部分更新。

如果您只想更新一个或多个属性,而保持其他属性不变,则可以使用 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 文档上执行任意原子事务。

于 2012-05-13T15:28:04.437 回答
0

我会说 cradle 目前缺少一个真正的部分更新功能,它还支持更新字段值的 JSON 数据中的键的路径,就像 Apache在这里演示的那样,而不是仅限于更新文档中的单个键,像 db.merge 方法。

其实看cradle源码,看到有一个Database.prototype.update方法(在lib/cradle/document.js中),但是这个方法好像没有文档记载。

可以将其作为 cradle 的一个组成部分将是优雅的,消除了仅针对部分更新对 CouchDB 视图更新执行单独请求的需要。

于 2014-01-13T15:23:49.360 回答