У нас есть коллекция Mongo с именем analytics, и она отслеживает посещения пользователей идентификатором файла cookie. Мы хотим рассчитать медианы для нескольких переменных, поскольку пользователи посещают разные страницы.Эффективный медианный расчет в MongoDB
Mongo does not yet have an internal method for calculating the median. Я использовал метод ниже, чтобы определить его, но я боюсь, что есть более эффективный способ, поскольку я довольно новичок в JS. Приветствуются любые комментарии.
// Saves the JS function for calculating the Median. Makes it accessible to the Reducer.
db.system.js.save({_id: "myMedianValue",
value: function (sortedArray) {
var m = 0.0;
if (sortedArray.length % 2 === 0) {
//Even numbered array, average the middle two values
idx2 = sortedArray.length/2;
idx1 = idx2 - 1;
m = (sortedArray[idx1] + sortedArray[idx2])/2;
} else {
//Odd numbered array, take the middle value
idx = Math.floor(sortedArray.length/2);
m = sortedArray[idx];
}
return m
}
});
var mapFunction = function() {
key = this.cookieId;
value = {
// If there is only 1 view it will look like this
// If there are multiple it gets passed to the reduceFunction
medianVar1: this.Var1,
medianVar2: this.Var2,
viewCount: 1
};
emit(key, value);
};
var reduceFunction = function(keyCookieId, valueDicts) {
Var1Array = Array();
Var2Array = Array();
views = 0;
for (var idx = 0; idx < valueDicts.length; idx++) {
Var1Array.push(valueDicts[idx].medianVar1);
Var2Array.push(valueDicts[idx].medianVar2);
views += valueDicts[idx].viewCount;
}
reducedDict = {
medianVar1: myMedianValue(Var1Array.sort(function(a, b){return a-b})),
medianVar2: myMedianValue(Var2Array.sort(function(a, b){return a-b})),
viewCount: views
};
return reducedDict
};
db.analytics.mapReduce(mapFunction,
reduceFunction,
{ out: "analytics_medians",
query: {Var1: {$exists:true},
Var2: {$exists:true}
}}
)
Каков прецедент для поиска медианы? Вы хотите, чтобы медиана значения по всей коллекции, просто пересматривалась постоянно, поскольку коллекция может измениться? Или вы хотите, чтобы медиана различных наборов результатов запроса? – wdberkeley
Например, мы отслеживаем поиск недвижимости и хотим узнать медианную цену списка домов, на которые они смотрят. И да, я работал в предположении, что нам нужно будет пересчитать медиану по мере роста коллекции. Я думал, что мы могли бы просто сохранить средние 3-4 значения между расчетами, но я не уверен, как его включить. – Crowson