Методы агрегации монгоидов во встроенных документах?

Как я могу запустить агрегат, минимум, максимум, сумму и друзей на встроенных документах?

Например:

Получите среднюю стоимость ВСЕХ событий, которые проводятся в округе, где они довольно глубоко укоренились.

District.schools.all.events.all.costs.avg(:value)

Очевидно, не работает.

District.avg('schools.events.costs.value')

И это не так. Это дает это сообщение об ошибке:

Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce
invoke failed: JS Error: TypeError: obj.schools 
has no properties reduce setup:1'; code:   '9010'; ok: '0.0').

Так возможно ли это или мне нужно написать свои собственные функции map/reduce?


person Yeggeps    schedule 20.02.2012    source источник


Ответы (1)


Да, MapReduce будет работать. Вы также можете использовать курсоры для обработки результата запроса. Нравится:

min = 99999999;
max = -99999999;
sum = 0;
count = 0
db.School.find({}).forEach(function(s) {
    if (s.first.events.first.cost < min)
        min = s.first.events.first.cost;
    if (s.first.events.first.cost > max)
        max = s.first.events.first.cost;
    sum += s.first.events.first.cost;
    ++count;
});

Теперь у вас есть минимум и максимум, и вы можете вычислить среднее и среднее из суммы и подсчета.

MongoDB не имеет возможности напрямую вычислять агрегатные функции на своем языке запросов. На самом деле это утверждение не совсем верно, так как есть функция count() для подсчета количества результатов, возвращаемых запросом, и есть функция group(). Но групповая функция очень похожа на MapReduce и не может использоваться в сегментированных базах данных. Если вас интересует групповая функция, см.: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

person dlaidlaw    schedule 20.02.2012
comment
Язык запросов MongoDB не имеет возможности вычислять агрегатные функции. Вы можете написать MapReduce или вычислить значения самостоятельно, как я продемонстрировал в примере, перебирая возвращаемые значения запроса. Дополнительные сведения о языке запросов: mongodb.org/display/DOCS/Advanced+Queries< /а> - person dlaidlaw; 21.02.2012