Я пытаюсь сделать простое представление, когда оно генерирует только те документы, идентификатор которых начинается с «rating-».Кажется, я не могу вызывать какие-либо функции "string:" вообще в couchdb.На самом деле не знаю, как это сделать ... Каждый пример, который я видел, никогда не сравнивает часть значения, всегда полное значение.В ecmascript я бы, наверное, просто сделал if (!doc._id.indexOf('rating-'))
.В этом коде ниже он жалуется, что один из аргументов, предоставленных для split, неверен.
fun({Doc}) ->
Id = proplists:get_value(<<"_id">>, Doc),
DocChk = binary:split(Id, <<"-">>),
case array:get(0, DocChk) of
<<"rating-">> -> Emit(Id, nil)
end
end.
У меня было несколько попыток, я пробовал что-то в оболочке Erlang, и хотя иногда я не могуполучить синтаксическую ошибку, я никогда не могу заставить что-либо работать на couchdb.Это весь взгляд, который я пытаюсь адаптировать из ecmascript.Как вы можете видеть ... я все еще застрял в строке 1 lol.
Карта
function (doc) {
if (doc._id.indexOf('rating-') !== 0) return;
if (!doc.isValid) return;
var nps;
doc.results.forEach(function (r) {
if (r.type === 'Nps') {
nps = r;
}
});
if (!nps) return;
var result = { t: 1, d: 0, p: 0 };
switch (nps.score) {
case 10:
case 9:
result.p++;
break;
case 8:
case 7:
break;
default:
result.d++;
break;
}
var week = new Date(doc.dateCaptured.year, doc.dateCaptured.month -1, doc.dateCaptured.day);
week.setDate(week.getDate() - ((week.getDay() === 0 ? 7 : week.getDay())-1));
emit(['week', doc.companyId, week.getFullYear(), week.getMonth()+1, week.getDate()], result);
emit(['day', doc.companyId, doc.dateCaptured.year, doc.dateCaptured.month, doc.dateCaptured.day], result);
emit(['month', doc.companyId, doc.dateCaptured.year, doc.dateCaptured.month], result);
emit(['year', doc.companyId, doc.dateCaptured.year], result);
emit(['week-bylocation', doc.companyId, doc.locationId, week.getFullYear(), week.getMonth()+1, week.getDate()], result);
emit(['day-bylocation', doc.companyId, doc.locationId, doc.dateCaptured.year, doc.dateCaptured.month, doc.dateCaptured.day], result);
emit(['month-bylocation', doc.companyId, doc.locationId, doc.dateCaptured.year, doc.dateCaptured.month], result);
emit(['year-bylocation', doc.companyId, doc.locationId, doc.dateCaptured.year], result);
emit(['week-bysource', doc.companyId, doc.sourceId, week.getFullYear(), week.getMonth()+1, week.getDate()], result);
emit(['day-bysource', doc.companyId, doc.sourceId, doc.dateCaptured.year, doc.dateCaptured.month, doc.dateCaptured.day], result);
emit(['month-bysource', doc.companyId, doc.sourceId, doc.dateCaptured.year, doc.dateCaptured.month], result);
emit(['year-bysource', doc.companyId, doc.sourceId, doc.dateCaptured.year], result);
}
Уменьшить
function (keys, values, rereduce) {
var result = { t: 0, p: 0, d: 0 };
values.forEach(function (v) {
result.t += v.t;
result.p += v.p;
result.d += v.d;
});
return result;
}
Производительность этого представления простослишком медленно.Это не будет проблемой постепенно, но мне нужно заполнить строки индекса 6,3 млн., И это займет около 12 часов на кластере из 3 узлов с общим количеством ядер 12.Определенно процессор.
Редактировать
Благодаря Hynek я смог перенести свою функцию карты.Я уверен, что это очень неэффективный эрланг, но он, кажется, примерно в 30 раз быстрее, чем его аналог ecmascript.
fun({Doc}) ->
case lists:keyfind(<<"_id">>, 1, Doc) of
{_, <<"rating-", _/bytes>> = Id} ->
case couch_util:get_value(<<"isValid">>, Doc) of
true ->
Results = proplists:get_value(<<"results">>, Doc),
case lists:dropwhile(fun({R}) -> <<"Nps">> /= proplists:get_value(<<"type">>, R) end, Results) of
[] -> ok;
[{Nps} | _] ->
Score = proplists:get_value(<<"score">>, Nps),
A = case Score of
S when S > 8 -> [1, 0, 1];
S when S > 6 -> [0, 0, 1];
_ -> [0, 1, 1]
end,
CompanyId = proplists:get_value(<<"companyId">>, Doc),
LocationId = proplists:get_value(<<"locationId">>, Doc),
SourceId = proplists:get_value(<<"sourceId">>, Doc),
{DateCaptured} = proplists:get_value(<<"dateCaptured">>, Doc),
Year = proplists:get_value(<<"year">>, DateCaptured),
Month = proplists:get_value(<<"month">>, DateCaptured),
Day = proplists:get_value(<<"day">>, DateCaptured),
Emit([<<"year">>, CompanyId, Year], A),
Emit([<<"month">>, CompanyId, Year, Month], A),
Emit([<<"day">>, CompanyId, Year, Month, Day], A),
Emit([<<"year-bylocation">>, CompanyId, LocationId, Year], A),
Emit([<<"month-bylocation">>, CompanyId, LocationId, Year, Month], A),
Emit([<<"day-bylocation">>, CompanyId, LocationId, Year, Month, Day], A),
Emit([<<"year-bysource">>, CompanyId, SourceId, Year], A),
Emit([<<"month-bysource">>, CompanyId, SourceId, Year, Month], A),
Emit([<<"day-bysource">>, CompanyId, SourceId, Year, Month, Day], A)
end;
_ -> ok
end;
_ -> ok
end
end.