如何在Couchbase MapReduce中迭代发出的值数组?

如何在Couchbase MapReduce中迭代发出的值数组?,mapreduce,couchbase,couchbase-view,Mapreduce,Couchbase,Couchbase View,我通过Map函数从bucket中获取记录,结果包含不同类型的记录(Entity1、Entity2、Entity3等等)。前- 元ID类似于Entity1::10101、Entity1::10102、Entity2::10101等等,因此我拆分了ID,并将第零个索引作为键,因为它代表实体;同一个bucket中可能有n个实体 减少部分-我将在值数组中以数组数组的形式获得发出的结果。当使用count_u函数时,我得到的值数组中记录的计数是1000,但当使用值的长度时,我得到的长度是10(应该是1000

我通过Map函数从bucket中获取记录,结果包含不同类型的记录(Entity1、Entity2、Entity3等等)。前-

元ID类似于Entity1::10101、Entity1::10102、Entity2::10101等等,因此我拆分了ID,并将第零个索引作为键,因为它代表实体;同一个bucket中可能有n个实体


减少部分-我将在值数组中以数组数组的形式获得发出的结果。当使用count_u函数时,我得到的值数组中记录的计数是1000,但当使用值的长度时,我得到的长度是10(应该是1000)。我知道这是因为CB将数组缩减为多个子数组,但我需要对整个数组进行迭代。当尝试迭代值的长度时,我的循环以i=10作为values结束。长度为10。如何一次迭代整个数组?

我认为这里的问题是对设计如何工作缺乏了解

首先要记住的是Couchbase是一个并行数据存储。如果您曾经在自己的代码中尝试过对并行数据结构进行迭代,那么您知道必须创建数组的副本,这样您就可以拥有一个在迭代时不会移动的数据结构。如果不这样做,许多框架将抛出异常以防止程序执行不一致

Couchbase不是数组。要能够在并行数据结构上进行迭代,必须能够在快照时的特定瞬间定义结构的边界。Couchbase没有这样的概念——它的设计是为了使并行数据结构达到最终的一致性——这意味着在任何时间点上都没有定义数据的有限边界。因此,实际上根本没有数组的概念——只有(无限)系列的单个对象


Map reduce是为并行执行而设计的。和前面一样,Couchbase map reduce函数必须能够对数据的任意子集执行,可能执行多次,以达到最终一致的状态。提供了一些有关如何工作的详细信息。基本上,您的
reduce
函数必须设计为能够处理增量更新,比如说第一次迭代处理100行。然后,在以后的某个任意点,处理20个新行。它将通过之前减少的100行,再加上新的20行,并期望您生成有效的输出。

1)我鼓励您尝试使用N1QL执行相同的用例。更简单。2) 您正在运行的查询是什么,分组设置是什么?此映射功能似乎可以大大简化。另外,你能澄清这个问题吗(你得到了什么,期望得到什么)?现在还不清楚。
function (doc, meta) {
if(meta.id.split('::')[0] == 'Entity1' && doc.status == 'NEW-DOC' )
{
emit('Entity1', {'id' :meta.id, 'status' : doc.status, 'type': doc.type} );
}
if(meta.id.split('::')[0] == 'Entity2' && doc.status == 'OLD-DOC' )
{
emit('Entity2', {'id' :meta.id, 'status' : doc.status, 'type': doc.type} );
}
if(meta.id.split('::')[0] == 'Entity3' && doc.status == 'DOC1' )
{
emit('Entity3', {'id' :meta.id, 'status' : doc.status, 'type': doc.type} );
}
}