Mongodb сложная карта / уменьшить - или я так думаю - PullRequest
0 голосов
/ 04 декабря 2011

У меня есть коллекция mongodb, которая содержит каждую продажу и выглядит так

{_id: '999', buyer:{city:'Dallas','state':'Texas',...}, products: {...}, order_value:1000, date:"2011-11-23T11:34:33Z" }

Мне нужно показать статистику об объемах заказов по штатам за последние 30, 60 и 90 дней. Итак, чтобы получить что-то вроде этого

State          Last 30       Last 60     Last 90
Arizona        12000         22000       35000
Texas          5000          9000        16000

как бы вы сделали это в одном запросе?

1 Ответ

0 голосов
/ 05 декабря 2011

Это не очень сложно:

map = function() {
   emit({key : this.buyer.state, value : order_value})
}

reduce = function(key,values) {
    sum = 0;
    values.forEach( function(o) {
         sum += o
         }
    return sum
   }

и затем вы уменьшаете свою коллекцию с помощью запроса {date: {$ gt: {[сегодня минус 30 дней]}} (Я не помню синтаксис, но вы должны превосходно документировать mapreduce на сайте mongodb).

Чтобы более эффективно использовать уменьшение карты, подумайте с постепенным уменьшением карты , сделав запрос сначала за последние 30 дней, а затем снова уменьшите (постепенно) фильтрацию карты от -60 до -30 дней, чтобы получить информацию о Последние дни. Наконец, запустите инкрементную карту, чтобы уменьшить фильтрацию от -60 до -90 дней, чтобы получить последние 90 дней.

Это неплохо, потому что у вас есть 3 запроса, но вы только пересчитываете агрегацию для данных, которых у вас еще нет.

Я могу привести пример, но вы должны сделать это сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...