Я создал представление mapreduce в Couchbase, чтобы найти последнее местоположение каждого человека.

Это следующие документы (существует несколько документов для одного и того же 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
}

После группировки результата по ключам я получаю отчасти правильный результат, но некоторые записи неверны, поскольку их «LatestLocation» отображается как пустое (""), что явно означает, что переменная по какой-то причине не обновляется. Я проверил и почти уверен, что LocationID и CaptureDate существуют в каждом отдельном документе. Я пробовал изучать редуцирование, но не мог этого понять, и, боюсь, именно это мешает мне получить правильный результат. Пожалуйста помоги

0
Krishan Jangid 27 Июл 2017 в 17:46

1 ответ

Лучший ответ

Я нашел решение этого вопроса на форуме couchbase. Поскольку сокращение основано на двух атрибутах, функция уменьшения должна возвращать эти два атрибута.

Вот код функции уменьшения.

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;
}
0
Krishan Jangid 31 Июл 2017 в 15:39