【问题标题】:CouchDb : How to combine query and update requests into one?CouchDb:如何将查询和更新请求合二为一?
【发布时间】:2013-03-11 02:26:16
【问题描述】:

我的couchDb文档的结构是这样的

帖子

 {
      _id : '123132adsf',
    'userId' :'7236jsdfkaf',
     'Title' : 'This is a sample post'
}

用户

{
   '_id' : '7236jsdfkaf',
   'count' : 1
}

我正在寻找的功能是每当使用 posts 查询 posts 文档时,查看拥有的 user 中的计数字段帖子已更新。是否有任何方法可以通过单个 couchDb 请求执行此操作,或者我必须向数据库发出两个请求,一个用于查询,一个用于更新。

【问题讨论】:

    标签: couchdb


    【解决方案1】:

    如果你事先知道帖子的 id,你就可以做到。您可以使用update function将帖子文档中viewed字段的值更改为1,并返回帖子的数据。不过,这是肮脏的黑客行为。相反,您将使用用户文档中的count,然后为用户减少viewed 的总和。问题是,您必须先知道帖子的 id,因为更新功能不能进行任意查询 - 它会修改给定的文档。

    【讨论】:

    • 这会将GET/view 更改为PUT/POST,从而形成一个不寻常的非传统Restful API。
    • 我还在回答中添加了更多细节,表明为什么以另一种方式这样做可能仍然是更好的选择。
    【解决方案2】:

    严格来说,从视图中读取时,您需要在其他地方添加功能。

    在 CouchDB 中,您需要能够读取用户文档(和修订版),并在只读查看操作期间将其设置回来。

    Document get 请求在读取期间不能影响(甚至读取)其他文档(视图也是只读的)。对于给定的文档版本,读取旨在可缓存。即使是 CouchDB 的 show (docs) 和 list 功能也可以防止这种情况发生。

    其他说明:

    另外,考虑 CouchDB 的问题不一定是执行自动递增字段的最佳选择。 Here 是一个很好的 StackOverflow 答案,详细说明了您可能面临的一些挑战。本质上,您可能会发现,由于在 CouchDB 中管理文档修订的方式,频繁的计数器递增(如您需要)而没有频繁的数据库压缩可能会导致磁盘利用率过高。其他系统可能更适合进行页面浏览计数。

    如果您建议使用 Update 函数 (docs),则缓存页面/帖子的成本会更高,并且要求 CouchDB 实例在每次请求帖子时始终返回修改后的文档/帖子,这是非常不必要的(如果可能,应该缓存在网络层上)。

    【讨论】:

    • 你做得很好,redis 可能是一个不错的选择。问题是我的架构的其余部分非常适合 couchDb,有了它,我在 iris couch 和 cloudant 中有非常好的提供商来提供托管. 使用两个数据库 couchDb 来存储数据并使用 redis 来增加字段和记录内容是否有意义?是否有一个好的(免费阅读 (:) redis 提供程序。如果我决定使用它可以在哪里托管它?
    • 我也对您可能想要建议的任何其他无 sql 数据库持开放态度。谢谢 :)
    • 如果您不是自托管,我推测您会为托管支付很多费用,因为您的写作方式。例如,Cloudant 的写入成本是读取成本的 5 倍。我还没有研究过 Redis 的免费主机。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多