У меня есть база данных со столбцом, содержащим массив строк. Пример таблицы:
name | words | ...
Ash | ["Apple", "Pear", "Plum"] | ...
Joe | ["Walnut", "Peanut"] | ...
Max | ["Pineapple", "Apple", "Plum"] | ...
Теперь я хотел бы сопоставить эту таблицу с заданным массивом слов и сгруппировать документы по степени их совпадения.
Пример ввода с ожидаемым результатом:
// matched for input = ["Walnut", "Peanut", "Apple"]
{
"1.00": [{name:"Joe", match:"1.00"}],
"0.33": [{name:"Ash", match:"0.33"}, {name:"Max", match:"0.33"}]
}
Я использую следующую функцию map
, выдающую документ с соответствующей скоростью в качестве ключа:
function map() {
var matches = 0.0;
for(var i in input)
if(this.words.indexOf(input[i]) !== -1) matches+=1;
matches /= input.length;
var key = ""+matches.toFixed(2);
emit(key, {name: this.name, match: key});
}
Теперь отсутствует соответствующая функция reduce
для объединения испускаемых пар KV в объект результата.
Я пробовал это так:
function reduce(key, value) {
var res = {};
res[key] = values;
return res;
}
Однако у меня проблемы со спецификацией, которая
MongoDB может вызывать функцию сокращения более одного раза для одного и того же ключа. В этом случае предыдущий вывод функции сокращения для этого ключа станет одним из входных значений для следующего вызова функции сокращения для этого ключа.
...что приводит к вложенным объектам результатов. Как правильно сгруппировать документы по их совпадению?