2012-02-16 2 views
0

Итак, я перемещаю часть своего кода из sql в mongodb, и мне мало что еще не ясно.Каков наилучший подход для запроса mongodb с суммой и сортировкой

Скажем, у меня есть следующий простой SQL-запрос (просто пример)

select count(a.id) as count, b_id 
     from table group by b_id 
     where c_id=[SOME ID] 
     group by b_id 
     order by count desc; 

я предполагаю, все понимают, что это делает.

Теперь с помощью mongo я могу использовать несколько подходов, сделать все это на стороне mongo, извлечь полученные результаты и отсортировать их на стороне клиента или просто получить необработанные данные на стороне клиента и выполнить всю обработку.

Что было бы лучшим подходом для запроса выше, чтобы сделать все это в базе данных с помощью некоторого внутреннего механизма mongodb (mapreduce и т. Д.) Или получить коллекцию на стороне клиента и обработать ее там. Набор данных в целом будет огромным, но при необходимости запрос можно разделить на несколько частей.

Клиент - это Java, если это имеет значение.

ответ

2

С наступающим MongoDB Aggregation Framework довольно легко сделать то, что вам нужно. Он уже доступен в версиях разработки 2.1.x.

Если вы застряли до 2.0 или более ранних версий, вам придется посмотреть либо варианты, упоминаемые вами, либо изменения схемы, чтобы избежать необходимости в первую очередь создавать агрегирование места. Например, в NoSQL довольно часто поддерживать поле или документ с агрегированными данными при манипулировании исходными данными. Наиболее распространенным примером является поддержание размера массива в качестве поля:

update({..}, {$push:{array:element}, $inc:{elementCount:1}) 
+0

Я пока не готов к производству, поэтому, на ваш взгляд, структура агрегации всегда наилучшим образом подходит для случая выше? – mikkom

+0

За исключением управления агрегированными данными вручную (что очень ситуативно) да. AF является полностью родным, тогда как группа и m/r работают на базе JavaScript и, таким образом, однопоточные и (относительно) медленные. Честно говоря, если вы хотите, чтобы m/r я интегрировал с Hadoop, а не использовал MongoDB m/r –

+0

Спасибо, я думаю, что мне придется установить последнюю неустойчивость. – mikkom

1

Вы можете группировать данные на стороне mongo с помощью Map/Reduce, а затем сортировать их либо со стороны клиента, либо с стороны монго. Вы также можете найти пример карты/примера here.

Смежные вопросы