MongoDB сгруппировать по (+ сортировать и ограничивать) - PullRequest
0 голосов
/ 02 апреля 2012

Итак, у меня есть следующая группа по SQL

select count(*) as NO_OF_MSGS,FROM_USER,PROFILE_IMG,MSG from MESSAGES group by FROM_USER order by NO_OF_MSGS desc,DATE_SENT limit ?,?

Как мне скопировать эту группу в MongoDB.Я сталкивался с этой превосходной записью - http://kylebanker.com/blog/2009/11/mongodb-count-group/

Это показывает, как вы можете использовать группирование в Mongo, но это не говорит о том, как реализовать order by и limitвнутри группы.

Также кажется, что Mongoid не поддерживает функцию group, кто-нибудь знает, отличается ли она от других?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Для группировки можно использовать метод рельсов group_by

http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by

А для заказа вы можете использовать метод Array sort_by

http://www.ruby -doc.org / ядро-1.9.3 / Array.html # метод-я-sort_by-21

1 голос
/ 02 апреля 2012

Как мне скопировать эту группу в MongoDB.Я наткнулся на эту превосходную статью - http://kylebanker.com/blog/2009/11/mongodb-count-group/

Во-первых, это 2-летняя статья.Эти операторы (count, group, distinct) все еще работают, но работают довольно медленно.Использование любого из этих операторов означает запуск Map / Reduce.И я не уверен, что для этих операторов когда-либо был реализован шардинг ( обратите внимание, что сообщение в блоге предшествует шардингу ).

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

Это показывает, как вы можете использовать group by в Mongo, но не говорит о том, как реализовать order by и limit внутри группы.

Преобразуемый вами запрос является простым запросом в SQL, но это не простой запрос в MongoDB.Проблема, с которой вы, вероятно, сталкиваетесь с Mongoid, заключается просто в том, что вы делаете то, что MongoDB просто не поддерживает ( за пределами новой структуры агрегации ).

Если у вас нет доступа кAggregation Framework, вам нужно будет сделать это в несколько шагов.

  1. Запустить M / R, чтобы получить count(*) grouped by X.
  2. Выполнить запрос на вывод M / R сваш sort(), skip(), limit().
  3. Выше может не работать, если у вас слишком много данных для сортировки (~ 1M пользователей), вам может понадобиться проиндексировать вывод M / Rчтобы сортировка работала.
0 голосов
/ 02 апреля 2012

Вы должны проверить Mongoid: Запрос .

Содержит объяснение того, как использовать order_by и limit.

EDIT:

Удален комментарий о том, что distinct и group by эквивалентны, как указано @mu. Вместо этого вам следует использовать group и предоставить функцию уменьшения, как подробно описано в статье, на которую вы ссылаетесь.

...