couchdb视图使用另一种视图?

时间:2013-08-06 12:16:26

标签: mapreduce couchdb

我对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函数调用视图并按上述方式进行计算?

3 个答案:

答案 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