我有一个文件桶,格式如下:
{
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5
}
这是我的映射功能:
function (doc, meta) {
var summary = {
b: doc.b,
c: doc.c,
history: [{
d: doc.d,
e: doc.e
}]
};
emit(doc.a, summary);
}
这是我的缩减功能:
function(key, values, rereduce) {
for (i = 1; i < values.length; ++i)
Array.prototype.push.apply(values[0].history, values[i].history);
return values[0];
}
最后,这是我的查看查询参数:
?stale=false&group=true&reduce=true
此组合会导致reduction too large
错误。现在,我的数据集中最多有两个相同的键,所以我可以将reduce函数更改为:
function(key, values, rereduce) {
if (values[1])
Array.prototype.push.apply(values[0].history, values[1].history);
return values[0];
}
保持其他一切相同,我得到了我想要的确切结果:
{
"key":1,
"value":{
"b":2,
"c":3,
"history":[
{
"d":4,
"e":5
},
{
"d":6,
"e":7
}
]
}
}, many more like this
但是,我希望密钥的数量随着时间的推移而增长,因此我需要能够遍历values
。
我还将我的reduce函数更改为只返回values.length
以检查它是否返回了不合理的值,但我得到的只是1
或2
。
发生了什么事?
更新
当我将reduce函数更改为:
时function(key, values, rereduce) {
if (rereduce) return "whatisgoingon";
for (i = 1; i < values.length; ++i)
Array.prototype.push.apply(values[0].history, values[i].history);
return values[0];
}
我得到了我想要的结果,但是在视图结果中找不到whatisgoingon
。我不想“丢弃”rereduce逻辑,因为我将来可能会实际使用它,所以我需要了解问题的原因。