2017-07-27 3 views
0

Ich habe eine Kartenansicht in Couchbase erstellt, um den aktuellen Standort jeder Person zu finden.Couchbase- Mapreduce: letzter Standort

Die Dokumente sind wie folgt (mehrere Dokumente für gleiche PersonID existieren):

{ 
    "_id": "PersonLocation::C38A2B74-166B-4EDE-A6E1-5B2DDE9350BB", 
    "type": "PersonLocation", 
    "PersonID": "AB62CD5B-ADDA-45E9-AFFE-76F4C0B97B52", 
    "CaptureDate": "2017-07-24T19:04:49.657", 
    "LocationID": "6E3E0CC4-FD8A-4602-8E68-C07E00DB6610" 
}, 
{ 
    "_id": "PersonLocation::930077A9-00DA-47C9-8A2C-8AB47ACFB83E", 
    "type": "PersonLocation", 
    "PersonID": "DD658CE5-BC54-4AB7-8DEC-544AD6662E09", 
    "CaptureDate": "2017-07-24T19:04:49.697", 
    "LocationID": "BC0E7923-3EDA-4CEF-864F-9B50AA218BBB" 
}..... 

Die Kartenfunktion ist:

function (doc, meta) { 
    if(doc.type =="PersonLocation"){ 
    emit(doc.PersonID,{'LocationID':doc.LocationID, 'CaptureDate':doc.CaptureDate}) 
    } 
} 

und Funktion reduzieren, ist:

function (keys, values) { 
var LatestDate ='' 
var LatestLocation = '' 

    for (var i = 0; i < values.length; i++) 
{ 
    var obj = values[i]; 
    if(obj.CaptureDate > LatestDate) 
    { 
     LatestDate = obj.CaptureDate; 
     LatestLocation =obj.LocationID 
    } 
} 
    return LatestLocation 
} 

Nach dem Gruppieren des Ergebnisses nach Schlüsseln bekomme ich ein etwas korrektes Ergebnis, aber einige Datensätze sind nicht korrekt als thei r 'LatestLocation' wird als leer angezeigt (""), was eindeutig bedeutet, dass die Variable aus irgendeinem Grund nicht aktualisiert wird. Ich habe überprüft und bin mir ziemlich sicher, dass die LocationID und CaptureDate in jedem einzelnen Dokument vorhanden sind. Ich habe versucht, über Verjüngung zu lernen, aber konnte nicht den Dreh raus und ich fürchte, das hindert mich daran, das richtige Ergebnis zu bekommen. Bitte helfen Sie

Antwort

0

Ich fand die Lösung dieses Problems auf Couchbase Forum. Da die Reduzierung auf zwei Attributen basiert, muss die Reduzierungsfunktion diese beiden Attribute zurückgeben.

Hier ist der Code für Reduce-Funktion.

function (keys, values) { 
    var response = {"LocationID":"", "CaptureDate":""}; 
    for (var i = 0; i < values.length; i++) 
    { 
    var obj = values[i]; 
    if(obj.CaptureDate > response.CaptureDate) 
    { 
     response.LocationID = obj.LocationID; 
     response.CaptureDate = obj.CaptureDate; 
    } 
    } 
    return response; 
}