MapReduce для подсчета значений параметров - PullRequest
4 голосов
/ 27 декабря 2010

У меня есть такой документ:

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i3"
    }
}

{
   "_id": ObjectId("4d17c7963ffcf60c1100002f"),
   "title": "Text",
   "params": {
     "brand": "BMW",
     "model": "i5"
    }
}

Что мне нужно, так это количество значений каждого параметра.как:

brand
---------
BMW (2)

model
---------
i3 (1)
i5 (1)

Я думаю, что я должен написать функции карты / уменьшить.Как я могу это сделать?Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 декабря 2010

Я думаю, мне нужно написать функции карты / сокращения.

Да, для этого вам нужно уменьшить карту.Для некоторых простых примеров сокращения карты, пожалуйста, посмотрите здесь .

Для вашего конкретного случая, вам сначала нужно изменить свое ожидание результата.Вывод карты / уменьшить является коллекцией.Коллекция будет выглядеть (в вашем случае) примерно так:

{ key : { 'brand' : 'bmw' }, value : 2 }
{ key : { 'model' : 'i5' }, value : 1 }

Чтобы сгенерировать этот набор, вам понадобится функция «map» и функция «Reduce».Функция map выдаст ключ и значение.Ключом является каждый элемент params, значением является счетчик 1. Функция «Reduce» принимает ключ и массив значений и возвращает только одно значение.Ваш вопрос в основном такой же, как этот пример на сайте MongoDB :

map = function() {
    if (!this.params) {
        return;
    }
    for (index in this.params) {
        emit(this.params[index], 1);
    }
}

reduce = function(previous, current) {
    var count = 0;

    for (index in current) {
        count += current[index];
    }

    return count;
}
1 голос
/ 27 декабря 2010

В вашей функции карты перечислите свойства свойства params объекта this. Для каждого свойства вы найдете вызов emit с ключом, который содержит как имя свойства, так и значение свойства. Передайте 1 в качестве значения. например emit({'brand','BMW'}, 1) но очевидно, что используются переменные, а не константы!

В вашей функции Reduce вам передаются ключ и массив значений. Суммируйте эти значения и верните сумму. Несмотря на то, что исходный массив будет равен всем единицам, не поддавайтесь искушению использовать длину массива, потому что функцию Reduce можно вызывать итеративно.

Впоследствии вы можете сгруппировать результаты из коллекции результатов, применив индекс, если это необходимо для производительности.

...