CouchDb:如何将查询和更新请求合并为一个?

CouchDb:如何将查询和更新请求合并为一个?,couchdb,Couchdb,我的couchDb文档的结构如下 帖子 { _id : '123132adsf', 'userId' :'7236jsdfkaf', 'Title' : 'This is a sample post' } 用户 { '_id' : '7236jsdfkaf', 'count' : 1 } 我正在寻找的功能是,每当使用posts视图查询posts文档时,拥有该post的用户中的count字段都会被更新。是否有任何方法可以通过单个couchDb请求实现

我的couchDb文档的结构如下

帖子

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

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

我正在寻找的功能是,每当使用posts视图查询posts文档时,拥有该post的用户中的count字段都会被更新。是否有任何方法可以通过单个couchDb请求实现此目的,或者我必须向数据库发出两个请求,一个用于查询,一个用于更新

严格来说,当从视图中读取时,您需要在其他位置添加功能

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

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

其他注意事项:

也可以考虑,CouCHDB不一定是做自动增量字段的最佳选择。这是一个很好的答案,详细说明了你可能面临的一些挑战。本质上,您可能会发现,由于CouchDB中管理文档修订的方式,频繁的计数器递增(如您所需)而不频繁的数据库压缩可能会导致磁盘利用率过高。其他系统可能更适合进行页面查看计数


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

严格地说,从视图中读取时,需要在其他位置添加功能

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

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

其他注意事项:

也可以考虑,CouCHDB不一定是做自动增量字段的最佳选择。这是一个很好的答案,详细说明了你可能面临的一些挑战。本质上,您可能会发现,由于CouchDB中管理文档修订的方式,频繁的计数器递增(如您所需)而不频繁的数据库压缩可能会导致磁盘利用率过高。其他系统可能更适合进行页面查看计数


如果您建议使用
Update
函数(),那么缓存页面/帖子会变得更昂贵,并且要求CouchDB实例在每次请求帖子时都返回一个修改过的文档/帖子,这是非常不必要的(如果可能,应该缓存在web层上).

如果你事先知道帖子的id,你就可以这么做。您可以使用将post文档中查看的
字段的值更改为
1
,并返回post的数据。不过,这是肮脏的黑客行为。相反,您将使用的用户文档中的
计数
,然后是用户查看的
的缩减总和
。问题是,您必须在之前知道帖子的id,因为更新函数不能执行任意查询-它会修改给定的文档。

如果您事先知道帖子的id,您就可以这样做。您可以使用将post文档中查看的
字段的值更改为
1
,并返回post的数据。不过,这是肮脏的黑客行为。相反,您将使用的用户文档中的
计数
,然后是用户查看的
的缩减总和
。问题是,您必须在之前知道帖子的id,因为更新功能无法执行任意查询-它会修改给定的文档。

这会将
GET
/视图更改为
PUT
/
post
,这是一个不同寻常的非传统Restful API。我在回答中还添加了一些细节,说明了为什么以另一种方式进行操作可能是更好的选择。这将
GET
/视图更改为
PUT
/
POST
,这是一个不同寻常的非传统Restful API。我在回答中还添加了一些细节,说明了为什么以另一种方式进行此操作可能仍然是一个更好的选择。你的观点很好,redis可能是一个不错的选择。问题是我的体系结构的其余部分非常适合couchDb,并且我在iris中有非常好的提供者Coach和cloudant提供托管。使用两个数据库couchDb来存储数据和redis来增加字段和日志记录是否有意义?是否有一个好的(免费阅读(:)redis提供商。如果我决定使用它,它可以托管在哪里?我也愿意接受您可能建议的任何其他无sql数据库。谢谢:)如果你不是自我托管,我想你会为你的写作方式付出很多。例如,Cloudant的读写成本是前者的5倍。我没有研究过Redis的免费主机。你的观点很好,Redis可能是一个不错的选择。问题是我的体系结构的其余部分非常适合couchDb,我在iris Coach和cloudant中有非常好的提供商来提供托管。使用两个数据库couchDb来存储数据和Redis来存储数据有意义吗增加字段和日志记录?是否有一个好的(免读(:)redis提供程序。如果我决定使用它,在哪里可以托管它?此外,我也愿意接受您可能建议的任何其他无sql数据库。谢谢:)如果您不是sel