编程语言
首页 > 编程语言> > javascript-动态减少功能会导致重新构造B树

javascript-动态减少功能会导致重新构造B树

作者:互联网

我对CouchDB的运作方式有些困惑.到目前为止,我已经了解到,第一次请求视图的map函数将导致ouchdb构造一个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()函数被调用多少次来计算查询的最终结果.如果您两次执行完全相同的查询,则第二次甚至可能不需要1次调用.

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

reduce(reduce(a) + reduce(b)) = reduce(a + b)

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

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

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

标签:couchdb,javascript
来源: https://codeday.me/bug/20191122/2062418.html