我有一个视图但是从视图结果中确实有重复的文档,如下所示,如何获得重复的结果并获得唯一的?提前谢谢你
{
"total_rows": 9,
"offset": 0,
"rows": [
{
"id": "xxxx",
"key": "12345",
"value": {
"_id": "abc123",
"_rev": "4-8db4da81d1e20afcea0a328fb16e7ec8",
"field1": "abc",
"field2": "dfr"
},
{
"id": "xxxx",
"key": "12345",
"value": {
"_id": "abc123",
"_rev": "4-8db4da81d1e20afcea0a328fb16e7ec8",
"field1": "abc",
"field2": "dfr"
},
]
}
视图就像这样
function(doc) {
if(doc){
for (var i in doc.item){
emit(doc.item[i].key,doc);
}
}
}
视图调用 ...._视图/复制?键= “12345”
执行以下reduce时我总是遇到这个错误:“ error”:“reduce_overflow_error”,“reason”:“减少输出必须缩小更多 迅速:
function (keys, values, rereduce) {
var uniqueKey = [];
var newValues = [];
for (var i=0; i<values.length; i++) {
if (uniqueKey.indexOf(values[i]._id)==-1) {
uniqueKey.push(values[i]._id);
newValues.push(values[i]);
}
}
return newValues;
}
答案 0 :(得分:0)
问题是你的地图功能:
function(doc) {
if(doc){
for (var i in doc.item){
emit(doc.item[i].key,doc);
}
}
}
通过这样做,您可以多次发出相同的文档,因此,在视图的结果中包含重复文档并不奇怪。如果您想要返回文档的所有项目而不重复,您可以执行以下简单的操作:
function(doc) {
if(doc.item) {
emit(doc.item, null)
}
}
另请注意,我emit(doc.item, null)
而非emit(doc.item, doc)
。发出文档是一种不好的做法,您应该使用选项include_docs=true
查询视图。否则,您的视图索引将与数据库具有相同的大小。