Couchbase-Mapreduce:最新位置
Couchbase- Mapreduce: latest location
我在 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
}
通过按键对结果进行分组后,我得到了一些正确的结果,但有些记录不正确,因为它们的 'LatestLocation' 显示为空白 (""),这显然意味着该变量由于某种原因未被更新.我检查并非常确定 LocationID 和 CaptureDate 确实存在于每个文档中。
我尝试研究 rereduce 但无法掌握它,恐怕这就是阻止我获得正确结果的原因。
请帮助
我在 couchbase 论坛上找到了这个问题的解决方案。
由于缩减是基于两个属性,reduce 函数需要 return 这两个属性。
这里是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;
}
我在 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
}
通过按键对结果进行分组后,我得到了一些正确的结果,但有些记录不正确,因为它们的 'LatestLocation' 显示为空白 (""),这显然意味着该变量由于某种原因未被更新.我检查并非常确定 LocationID 和 CaptureDate 确实存在于每个文档中。 我尝试研究 rereduce 但无法掌握它,恐怕这就是阻止我获得正确结果的原因。 请帮助
我在 couchbase 论坛上找到了这个问题的解决方案。 由于缩减是基于两个属性,reduce 函数需要 return 这两个属性。
这里是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;
}