我对couchdb中的视图有疑问 目前,我有许多视图(例如view_A,view_B .... view_Z),对于每个视图,它们包含相同范围的键但具有不同的值。即:
view_A = {"key":"key_1", "value":10}, {"key":"key_2", "value":100}
view_B = {"key":"key_1", "value":5}, {"key":"key_2", "value":2}
view_C = {"key":"key_1", "value":1}, {"key":"key_2", "value":2}
我希望有一个视图来表示view_A中的值除以view_B =>中的值
view_A_over_B = {"key":"key_1", "value":2}, {"key":"key_2", "value":50}
在view_B中表示值的视图在view_B =>
中的值view_C_times_B = {"key":"key_1", "value":5}, {"key":"key_2", "value":4}
是否可以使用map / reduce函数调用视图并按上述方式进行计算?
答案 0 :(得分:2)
CouchDB中的视图只能访问当前正在处理的文档,无法访问其他文档或其他视图中的数据。所以,遗憾的是,使用CouchDB中的视图来构建所需的功能是不可能的。
由于目前尚不清楚如何构建视图,因此可以使用List函数而不是视图来构建所需的结果。列表函数功能更强大,但您负责输出结果(如HTML,Json等)。
答案 1 :(得分:1)
在文档保存期间,查看功能只运行一次。
您可以定义计算所需数字的javascript函数,而不是在视图中包含以下内容:
view_A:
...
emit(doc._id, funcA(doc));
...
view_B:
...
emit(doc._id, funcB(doc));
...
view_C:
...
emit(doc._id, funcC(doc));
...
view_A_over_B:
...
emit(doc._id, funcA(doc)/funcB(doc));
...
view_C_times_B:
...
emit(doc._id, funcC(doc)*funcB(doc));
...
您可以使用CommonJS Modules来定义funcA,funcB和funcC。或者使用obsolete macro。
答案 2 :(得分:1)
已经提到过无法对其他视图使用视图,最多可以将某些列表功能应用于特定视图(具有完全扫描处理复杂性的成本),但您仍然可以查看第三方工具,例如{ {3}}用于链式视图支持。另外,Couch-Incarnate支持Cloudant。