Ответ 1
Вы можете передавать глобальные данные только для чтения в функции уменьшения карты, используя параметр "scope" в команде map-reduce. Боюсь, это не очень хорошо документировано.
Учитывая документ
{_id:110000, groupings:{A:'AV',B:'BV',C:'CV',D:'DV'},coin:{old:10,new:12}}
Мои спецификации требуют спецификации атрибутов для сопоставления и агрегации во время выполнения, поскольку группы, заинтересованные пользователем, неизвестны заранее, но указаны пользователем во время выполнения.
Например, один пользователь будет указывать [A, B], что приведет к отображению выбросов
emit( {A:this.groupings.A,B:this.groupings.B},this.coin )
в то время как другой хотел бы указать [A, C], что приведет к отображению выбросов
emit( {A:this.groupings.A,C:this.groupings.C},this.coin )
B/c функции отображения и редуктора выполняют серверную часть и не имеют доступа к клиентским переменным, я не смог придумать способ использования ключа переменной карты в функции mapper.
Если бы я мог ссылаться на список вещей, которые можно группировать из области выполнения функции карты, все это очень просто. Тем не менее, b/c функция сопоставления заканчивается тем, что получает их из разных областей, я не знаю, как это сделать, или если это возможно.
Прежде чем я начну пытаться динамически строить java script для выполнения через драйвер, есть ли у кого-нибудь лучшее предложение? Может быть, функция "группы" справится с этим сценарием лучше?
Вы можете передавать глобальные данные только для чтения в функции уменьшения карты, используя параметр "scope" в команде map-reduce. Боюсь, это не очень хорошо документировано.
Как отметил Гриффит @Dave, вы можете использовать scope
параметр mapReduce
функции.
Я изо всех сил пытался выяснить, как правильно передать его в функцию, потому что, как отмечают другие, документация не очень подробная. Наконец, я понял, что mapReduce
ожидает 3 параметра:
В конце концов я пришел к следующему коду в Javascript:
// I define a variable external to my map and to my reduce functions
var KEYS = {STATS: "stats"};
function m() {
// I use my global variable inside the map function
emit(KEYS.STATS, 1);
}
function r(key, values) {
// I use a helper function
return sumValues(values);
}
// Helper function in the global scope
function sumValues(values) {
var result = 0;
values.forEach(function(value) {
result += value;
});
return result;
}
db.something.mapReduce(
m,
r,
{
out: {inline: 1},
// I use the scope param to pass in my variables and functions
scope: {
KEYS: KEYS,
sumValues: sumValues // of course, you can pass function objects too
}
}
);