【问题标题】:CouchDB partial/differential writesCouchDB 部分/差异写入
【发布时间】:2014-01-13 23:23:49
【问题描述】:

基本问题

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

示例

鉴于这个简单的文档:

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

【问题讨论】:

    标签: node.js couchdb express


    【解决方案1】:

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

    您可以创建(或使用)垫片代码来模拟您想要的,让您专注于重要部分。在服务器端,可以使用update functions

    客户端有很多解决方案。

    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 文档上执行任意原子事务。

    【讨论】:

    • +1。我冒昧地充实内容,链接到相关工具(我维护)以及服务器端部分更新的官方文档。
    • 感谢两位的意见。 “更新功能”是我所追求的理想解决方案......不敢相信我在文档中错过了它们。非常感谢!我个人从来没有真正接受过crade,而是更喜欢nano
    • +1 是一个很好的详细答案,但主要是为了很棒的例子^^
    【解决方案2】:

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

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

    如果可以将其作为 cradle 的一个组成部分,那就太好了,这样就无需仅为部分更新单独请求 CouchDB 视图的更新。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2022-01-03
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多