Javascript 动态reduce函数会导致重构B-树吗
我对CouchDB的运作方式有点困惑。到目前为止,我已经了解到,第一次请求视图的map函数将导致couchdb构造一个b树索引,该索引将在下面的运行中被引用 我不确定的是,如果每次请求视图时我的reduce函数返回不同的文档,b树是否会重新构造 谢谢reduce()函数不返回文档,它返回给定值集的缩减值。map-reduce的模式如下所示。为数据库中的每个文档调用map()函数。从map()可以发射()任意数量的视图行。您可以使用如下代码执行此操作:Javascript 动态reduce函数会导致重构B-树吗,javascript,couchdb,Javascript,Couchdb,我对CouchDB的运作方式有点困惑。到目前为止,我已经了解到,第一次请求视图的map函数将导致couchdb构造一个b树索引,该索引将在下面的运行中被引用 我不确定的是,如果每次请求视图时我的reduce函数返回不同的文档,b树是否会重新构造 谢谢reduce()函数不返回文档,它返回给定值集的缩减值。map-reduce的模式如下所示。为数据库中的每个文档调用map()函数。从map()可以发射()任意数量的视图行。您可以使用如下代码执行此操作: emit(key, value); 需要注
emit(key, value);
需要注意的是,对于每个文档修订版,map()只调用一次,稍后将缓存此结果。结果只能取决于文档,不能从请求传递任何参数或发出随机数
然后,当查询视图并定义了reduce()函数时,将为匹配查询键范围的文档发出的所有行调用该函数。同样,无法从请求传递参数。结果只能取决于传递给reduce()函数的值
在内部,b树结构用于缓存和最小化所需的计算量。可以使用相同的map()函数代码和不同的reduce()函数定义多个视图。CouchDB足够聪明,可以对map()的输出进行切分,并且调用它的次数不会超过需要的次数
我希望事情会明朗一点。祝你好运
--编辑以下内容以回答有关在reduce()中选择随机行的评论--
通常,在map()或reduce()中使用random不利于map reduce过程的设计。如果在map()或reduce()函数中使用随机性,则随机结果将被缓存。reduce()的结果会缓存到行的不同子集。您不知道或不控制调用reduce()函数计算查询最终结果的次数。如果执行两次完全相同的查询,第二次甚至可能不需要一个调用
此外,函数reduce()的设计要求满足以下关系:
reduce(reduce(a) + reduce(b)) = reduce(a + b)
以上a和b是关键值范围。如果在reduce body中使用random,这显然不成立
据我所知,您只想从视图中获取随机行。为什么不在视图中使用reduce=“\u count”。然后,您可以在两个查询中执行任务:
- 获取行数的第一个查询
- 使用reduce=false&skip=random(count)&limit=1进行第二次查询,以获取视图的随机行。这里在客户端计算随机数(计数)