动态减少函数会导致重构B树

时间:2013-09-12 04:42:49

标签: javascript couchdb

我对CouchDB的运作方式感到有些困惑。到目前为止,我已经了解到第一次请求视图的map函数将导致couchdb构造一个b-tree索引,该索引在以下运行中被引用。

我不确定的是,如果每次请求视图时我的reduce函数返回不同的文档,是否会重构b树?

谢谢

1 个答案:

答案 0 :(得分:3)

reduce()函数不返回文档,它返回给定值集的减少值。 map-reduce的模式如下。为数据库中的每个文档调用map()函数。从map()中可以发出()任意数量的视图行。您可以使用以下代码执行此操作:

emit(key, value);

重要的是要注意map()只为每个文档修订调用一次,稍后将缓存此结果。结果只能取决于文档,您不能从请求中传递任何参数或发出随机数。

在查询视图时,如果定义了reduce()函数,则会为匹配查询键范围的文档发出的所有行调用它。同样,没有办法从请求中传递参数。结果只能依赖于传递给reduce()函数的值。

b-tree结构在内部用于缓存和最小化所需的计算量。您可以使用相同的map()函数代码和不同的reduce()函数定义多个视图。 CouchDB足够聪明,可以对map()的输出进行分片,而不是多次调用它。

我希望这清楚一点。祝你好运!

- 在下面编辑以回答有关在reduce() -

中选择随机行的注释

通常在map()或reduce()中使用random是违反map-reduce过程的设计。如果在map()或reduce()函数中使用随机性,随机结果将被缓存。 reduce()的结果被缓存为行的不同子集。您不知道或控制调用reduce()函数计算查询的最终结果的次数。如果您执行两次完全相同的查询,则第二次可能甚至不需要1次调用。

还有reduce()函数的设计要求满足以下关系:

reduce(reduce(a) + reduce(b)) = reduce(a + b)
上面的

a b 是键值范围。如果你在reduce体内使用随机,这显然是不成立的。

据我了解,您只想从视图中获取随机行。为什么不在视图中使用reduce =“_ count”。您可以在两个查询中执行任务:

  • 获取行数的第一个查询

  • 使用 reduce = false& skip = random(count)& limit = 1 进行第二次查询以获取视图的随机行。这里随机(计数)在客户端计算。