Упорядочить элементы в MongoDB в соответствии с размером массива с помощью MongoMapper?

Я хотел бы выбрать коллекцию элементов, упорядоченных по количеству элементов в массиве. Надеюсь, следующий пример прояснит мое довольно слабое объяснение:

class Thing
  include MongoMapper::Document

  key :name, String
  key :tags, Array
end

Я хотел бы получить все ThingЗаказывается у тех, у кого больше меток, у тех, у кого меньше всего. Теги в этом примере - это просто строки в массиве тегов. В основном я хочу что-то, что означает то же самое, что и это (но работает):

Thing.all(:order => 'tags.count desc')

Это возможно?

1 ответ

Решение

Главный сервер в настоящее время не поддерживает вычисление размера массива и последующую сортировку по нему. Я думаю, что на данный момент вам лучше всего кэшировать размер массива самостоятельно и добавить индекс в это поле.

class Thing
  include MongoMapper::Document

  key :name,     String
  key :tags,     Array
  key :tag_size, Integer, :default => 0, :index => true
end

Затем просто добавьте обратный вызов в вашу модель, который обновляет tag_size при сохранении.

Если это функция, которую вы хотели бы видеть на главном сервере, вы можете добавить случай здесь:

http://jira.mongodb.org/browse/SERVER

Другие вопросы по тегам