2017-07-27 11 views
0

Couchbaseでmapreduceビューを作成して、各人の最新の場所を見つけました。Couchbase- Mapreduce:最新の場所

文書は(同じPERSONIDための複数の文書が存在しない)、次のとおりである。

{ 
    "_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" 
}..... 

マップ機能は次のとおりです。

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

と機能を減らすには、次のとおりです。

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 
} 

結果をキーでグループ化した後、いくらか正しい結果が得られますが、いくつかのレコードはthei r 'LatestLocation'は何らかの理由で変数が更新されていないことを意味する空白( "")として表示されています。私は、すべての単一のドキュメントにLocationIDとCaptureDateが存在することを確認しました。 私はrereduceについて勉強しようとしましたが、それを掛けることができませんでした。これが正しい結果を得ることを妨げているのではないかと恐れています。 助けてください

答えて

0

私はこの問題の解決策をcouchbaseフォーラムで見つけました。 縮小は2つの属性に基づいているため、reduce関数はこれらの2つの属性を返す必要があります。

ここにreduce関数のコードを示します。

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; 
} 
関連する問題