2016-07-13 8 views

ответ

1

Документ говорит, что вы не можете OrderBy используя размер.

Попробуйте добавить новый столбец, содержащий значение размера и сортировку, который будет работать как заказ.

-1

В рубин, вы можете отсортировать массив как это:

my_array.sort_by(&:my_attr) 

Он сортирует массив my_array атрибутом my_attr каждого элемента внутри массива.

Вы также можете написать это:

my_array.sort_by{|element| element.my_attr } 

Который является точно такой же, он будет сортировать атрибутом каждого элемента my_attr. Этот второй синтаксис заключается в том, когда вы хотите более сложное условие сортировки, чем просто результат метода каждого элемента.

Документация: http://ruby-doc.org/core-2.3.1/Enumerable.html#method-i-sort_by

+0

Как это относится к вопросу? OP имеет поле массива внутри MongoDB, и они хотят сортировать коллекцию MongoDB по длине этого массива. –

+0

Я хочу сортировать коллекцию на основе поля, которое находится внутри модели и ее массива. Например, Post - это модель, а «любит» - это поле, которое представляет собой массив user_id. Поэтому я хочу сортировать Post, исходя из длины массива like. @muistooshort это именно то, что я хочу. –

2

Монго документация says:

Вы не можете использовать $ размер, чтобы найти диапазон размеров (например: массивы с более чем 1 элемент). Если вам нужно запросить диапазон, создайте поле дополнительного размера , которое вы увеличиваете при добавлении элементов. Индексы не могут использоваться для части размера $ size запроса, хотя, если включены другие выражения запроса , индексы могут использоваться для поиска совпадений на этой части выражения запроса.

Поэтому мы не можем сделать заказ, используя mongo's $size.

Вы можете решить свою задачу, добавив новое поле, в котором будет храниться размер массива.

class Post 
    include Mongoid::Document 
    field :likes, type: Array, default: [] 
    field :likes_size, type: Integer 

    before_save do 
    self.likes_size = likes.size 
    end 
end 

Сортировать по postslikes_size:

Post.order_by(likes_size: :desc) 
+0

Я хочу сортировать коллекцию на основе поля, которое находится внутри модели и ее массива. Например, Post - это модель, а «любит» - это поле, которое представляет собой массив user_id. Поэтому я хочу сортировать Post, исходя из длины массива like. –

+0

Спасибо, еще один быстрый вопрос У меня есть Postactivity, которая является моделью, которая имеет post_id как внешний ключ (отношение has_one), и эта модель имеет массив like. теперь, как мне сортировать модель Post. Спасибо заранее ... очень ценю ваше время. –

+0

@BalajiThiru вы можете создать новый вопрос со всеми подробностями. Я постараюсь помочь. –

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