2017-07-17 5 views
0

Ich versuche zu verstehen, wie berechnete Daten auf Dokumenten mit CouchDB und PouchDB zurückgegeben werden. Angenommen, ich habe zwei Arten von Dokumenten auf meiner CouchDB: Blöcke und Berichte.berechnete Daten mit CouchDB und PouchDB anzeigen

Reports besteht aus: report_id, block_id und date.

Block besteht aus: und name.

Ich würde gerne für jeden Block seine letzte report_id (die ID des letzten Berichts) berechnen, und es mit Block Doc zurückgeben.

Gibt es eine Möglichkeit, das zu erreichen? Ich gehe davon aus, dass eine Ansicht von einem Typ den Trick machen wird, aber ich kann es nicht herausfinden.

Antwort

1

Sie können dies mit Karten/reduzieren Funktionen in CouchDB tun.

Angenommen, Sie haben diese Dokumente haben:

{ 
    "_id": "report_1", 
    "type": "report", 
    "block_id": "block_1", 
    "date": "1500325245" 
} 



{ 
    "_id": "report_2", 
    "type": "report", 
    "block_id": "block_1", 
    "date": "1153170045" 
} 

Sie möchten die Berichte mit dem höchsten Zeitstempel erhalten (in diesem Fall repot_1).

Wir beginnen mit dem Erstellen einer Zuordnungsfunktion, die die Dokumente mit der Funktion bloc_id als Schlüssel und der Zeitstempel + Berichts-ID als Wert für die Reduzierungsfunktion abbildet.

Karte:

function (doc) { 
    if(doc.type == "report") 
    emit(doc.block_id,{date:doc.created,report:doc._id}); 
} 

Dann erstellen wir eine Funktion reduzieren. Wenn reduce false ist, geben wir einfach die Werte zurück. Wenn rereduce wahr ist, werden wir die maximale Zeitstempel und gibt den Bericht-ID finden assoziiert es

Reduce Funktion:

function (keys, values, rereduce) { 
    if (rereduce) { 
     var max = 0; 
     var maxReportId = -1; 
     for (var i = 0; i < values.length; i++) { 
      var val = values[i][0]; 
      if (parseInt(val.date) > max) { 
       max = val.date; 
       maxReportId = val.report; 
      } 
     } 
     //We return the report id of the most recent report. 
     return maxReportId; 
    } else 
     return values; 
}