2016-05-26 11 views
0

Ich habe eine Ansicht, aber habe Dokumente aus den Ergebnissen der Ansicht wie folgt verdoppelt, wie kann ich die doppelten Ergebnisse erhalten und die einzigartige? Vielen Dank im Vorausgibt es eine Möglichkeit, den Duplikationsdatensatz von den Ergebnissen zu löschen?

{ 
"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" 
       }, 
      ] 
     } 

Die Ansicht wie diese

function(doc) { 
if(doc){ 
    for (var i in doc.item){ 
      emit(doc.item[i].key,doc); 
     } 
    } 
} 

Ansicht von ...._ Ansicht genannt

ist/duplizieren? key = "12345"

ich diesen Fehler immer hatte, wenn Führen Sie die folgende Reduzierung aus: "Fehler": "reduce_overflow_error", "Grund": "Reduzieren der Ausgabe muss mehr schrumpfen rapid:

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

Können Sie bitte den Code zeigen, wo Sie die Daten vorbereiten, bevor Sie sie zur Ansicht schicken? –

+0

Hallo Emre, danke, ich habe nicht den Code, ich möchte nur Karte oder reduzieren usw. Funktion in Couchdb verwenden, um die gleichen anderen Dokumente mit dem angegebenen Schlüssel loszuwerden – Jamesjin

Antwort

0

Das Problem ist Ihre Karte Funktion:

function(doc) { 
if(doc){ 
    for (var i in doc.item){ 
      emit(doc.item[i].key,doc); 
     } 
    } 
} 

Dadurch, dass Sie das gleiche Dokument mehrfach aussenden, daher sollte es nicht überraschend, dass Sie doppelte Dokumente haben in den Ergebnissen Ihrer Ansicht. Wenn Sie alle Elemente für ein Dokument ohne Duplikat zurückkehren möchten, können Sie etwas so einfach wie das tun:

function(doc) { 
    if(doc.item) { 
    emit(doc.item, null) 
    }  
} 

Bitte beachten Sie auch, dass ich emit(doc.item, null) und nicht emit(doc.item, doc). Es ist eine schlechte Übung, das Dokument auszugeben, Sie sollten stattdessen die Ansicht mit der Option include_docs=true abfragen. Andernfalls wird Ihr Ansichtsindex die gleiche Größe wie Ihre Datenbank haben.