Mongoid агрегатные методы на встроенных документах? - PullRequest
1 голос
/ 20 февраля 2012

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

Например:

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

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').

Так возможно ли это, или мне нужно написать свою собственную карту / уменьшить функции?

1 Ответ

2 голосов
/ 20 февраля 2012

Да, 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

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