Javascript 动态reduce函数会导致重构B-树吗

Javascript 动态reduce函数会导致重构B-树吗,javascript,couchdb,Javascript,Couchdb,我对CouchDB的运作方式有点困惑。到目前为止,我已经了解到,第一次请求视图的map函数将导致couchdb构造一个b树索引,该索引将在下面的运行中被引用 我不确定的是,如果每次请求视图时我的reduce函数返回不同的文档,b树是否会重新构造 谢谢reduce()函数不返回文档,它返回给定值集的缩减值。map-reduce的模式如下所示。为数据库中的每个文档调用map()函数。从map()可以发射()任意数量的视图行。您可以使用如下代码执行此操作: emit(key, value); 需要注

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

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

谢谢

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

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进行第二次查询,以获取视图的随机行。这里在客户端计算随机数(计数)


感谢您的澄清,马雷克。如果我错了,请纠正我。因此,我定义了一个视图来返回许多行,还有一个reduce函数将其“减少”为一个随机选取的行。据我所知,这种安排不会影响性能,对吗?我看过“跳过”一词,并对此表示担忧,因为跳过仍会访问每一行,但不会从中返回数据,从而在需要跳过数千行时降低性能(我们正在开发的应用程序预计将拥有数千名用户)使用skip只是指定查询范围的另一种方式。当然,需要计算视图索引,但对于任何类型的查询都是如此,并且结果由服务器缓存。我不认为效率会有问题。我只是认为,由于缓存的原因,它不会像您预期的那样工作。要清楚,假设您总是查询视图的reduce=true,具有打开键范围(所有文档),并具有reduce()函数,该函数随机选择一行。我认为将发生的是,在您第一次查询视图时,reduce()只会被调用一次。稍后,由于缓存,您将得到相同的结果。这不是随机的:)在我们的开发环境(node.js+nano)中重新测试了我的随机简化视图,它确实返回了一个缓存结果。(正在通过curl进行尝试,而couchdb没有以这种方式缓存它)