2016-05-26 5 views
0

J'ai une vue mais j'ai eu des documents dupliqués à partir des résultats de la vue comme suit, comment puis-je obtenir les résultats en double et obtenir l'unique? merci d'avanceest-il un moyen d'effacer les enregistrements de duplication à partir des résultats?

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

La vue est comme ce

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

vue appelé par ...._ vue/double? key = "12345"

J'ai toujours eu cette erreur lorsque exécutez la commande suivante: "erreur": "reduce_overflow_error", "raison": "Réduire la sortie doit réduire plus rapidement:

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

Pouvez-vous indiquer le code dans lequel vous préparez les données avant de les envoyer? –

+0

Salut Emre, merci, je n'ai pas le code, je veux juste utiliser la fonction map ou reduce etc dans couchdb pour me débarrasser des mêmes documents avec la clé donnée – Jamesjin

Répondre

0

La question est votre fonction carte:

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

En faisant cela, vous émettez le même document plusieurs fois, donc il ne devrait pas être une surprise que vous avez des documents en double dans les résultats de votre vue. Si vous voulez retourner tous les éléments d'un document sans double, vous pouvez faire quelque chose d'aussi simple que cela:

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

s'il vous plaît noter également que je ne emit(doc.item, null) et non emit(doc.item, doc). C'est une mauvaise pratique d'émettre le document, vous devriez plutôt interroger la vue avec l'option include_docs=true. Sinon, votre index de vue aura la même taille que votre base de données.