Параметр Mongoid limit игнорируется - PullRequest
3 голосов
/ 13 марта 2012

Я пытался получить последние N записей с уникальным значением (first_name).

Пока:

@users = User.all(:limit => 5, :sort => [:created_at, :desc]).distinct(:first_name)

почти работает .. Но игнорирует лимит и порядок сортировки
Также:

@users = User.limit(5).desc(:created_at).distinct(:first_name)

Игнорирует как 'limit', так и 'desc'

@users = User.limit(5)

Работает ..

Что я делаю не так?
Любая помощьбыл бы очень признателен!

Ответы [ 4 ]

1 голос
/ 13 марта 2012

Я играл с этим некоторое время, и это лучшее, что я мог придумать.

Удачи.

@users = User.desc(:created_at).reduce([]) do |arr, user|
  unless arr.length == 5 || arr.detect{ |u| u.first_name == user.first_name }
    arr << user
  end
  arr
end
0 голосов
/ 27 мая 2016

Я играл с некоторым результатом, я нашел это.

User.limit(2).count => 10   #but in array I found only two results
User.limit(2).to_a.count => 2 

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

0 голосов
/ 12 мая 2015

И distinct, и count игнорируют команду limit в Mongoid.С count вы можете передать true (то есть User.limit(5).count(true)), чтобы заставить его обратить внимание на область.К сожалению, такой хитрости не существует, насколько я знаю (см. Docs / source здесь ).

Если вы хотите просто взять первые 5 first_name, то выможет сделать это (не различимо):

User.desc(:created_at).limit(5).map(&:first_name)

Это будет соответствовать пределу, но при этом загрузить 5 полных объектов из базы данных (затем отбросить оставшуюся часть объекта, чтобы дать вам полныйназвание).Если вам действительно нужно работать по-другому, вам лучше перейти к решению на основе инфраструктуры агрегации.

Я не тестировал, но, похоже, это то, что вы ищете: https://stackoverflow.com/a/17568267/127311

0 голосов
/ 04 сентября 2012

Вы пытались использовать драгоценный камень для нумерации страниц, такой как amatsuda / kaminari, и ограничивать результаты, используя page().per()?

...