好的,整个周末我一直在为这个问题喋喋不休,我终于难倒了。我的reduce map func:
function(doc) {
if(doc.primary_keys) {
for(pi in doc.primary_keys) {
var pk = doc.primary_keys[pi];
for(row_i in doc.data) {
var row = doc.data[row_i];
if(row[pk]) {
emit([row[pk]], doc._id);
}
}
}
}
}
我的观点减少了:
function(keys, values) {
var retval = {};
for(var val_i in values) {
var key = values[val_i];
if(key in retval) {
retval[key] += 1;
} else {
retval[key] = 1;
}
}
return(retval);
}
这是我的本地(Couchbase)CouchDB返回的内容:
key value
["a"] {test2: 1, test: 1}
但是这里的Cloudant回归:
key value
["a"] {[object Object]: 1, [object Object]: 1}
我怀疑有一些js env的区别,但是每个解决方案都会让我遇到同样的问题; Cloudant的值[val_i]的值是对象类型,我期望一个字符串。我不知道为什么。如果有帮助的话,我现在非常愿意重新减少。
为什么这些不同?
答案 0 :(得分:4)
首先,您需要指定reduce函数在rereduce情况下的工作方式(http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views有信息)。在Cloudant上,始终调用rereduce(将各种分片中的数据收集到最终视图结果中)。这就是你得到你所看到的回应的原因。
其次,看起来你正试图通过primary_key获取数据。通常,您希望使用内置的_sum
函数 - 它比自定义js代码更快,_sum
可以在Cloudant中使用对象。
第三,未减少的视图将自动包含doc._id,因此发出1以使_sum
工作。