То, что вы делаете, прекрасно работает для меня, и оно должно работать.
Однако, если у вас есть только ограниченное количество значений totalcount
, вы получите набор результатов, который выглядит случайным. Рассмотрим коллекцию, в которой большинство значений totalcount
равно 2:
> show = ->(o) { puts "totalcount = #{o['totalcount'].to_i}, other = #{o['other'].to_i}" }
> t.find().each(&show)
totalcount = 1, other = 1
totalcount = 1, other = 4
totalcount = 2, other = 3
totalcount = 2, other = 2
totalcount = 2, other = 1
totalcount = 2, other = 4
Теперь мы сортируем его по totalcount
(и только по totalcount
):
> t.find({}, :sort => ['totalcount', Mongo::DESCENDING]).each(&show)
totalcount = 2, other = 3
totalcount = 2, other = 2
totalcount = 2, other = 1
totalcount = 2, other = 4
totalcount = 1, other = 1
totalcount = 1, other = 4
Теперь мы применяем :limit
, который просто оставляет нам только totalcount == 2
значения:
> t.find({}, :sort => ['totalcount', Mongo::DESCENDING], :limit => 4).each(&show)
totalcount = 2, other = 3
totalcount = 2, other = 2
totalcount = 2, other = 1
totalcount = 2, other = 4
Вы заметили, как порядок other
выглядит случайным? Но если мы добавим вторичный ключ сортировки, мы получим что-то вроде сортировки:
> t.find({}, :sort => [['totalcount', Mongo::DESCENDING], ['other', Mongo::ASCENDING]], :limit => 4).show(&each)
totalcount = 2, other = 1
totalcount = 2, other = 2
totalcount = 2, other = 3
totalcount = 2, other = 4
totalcount
звучит как то, что не имеет такого количества значений и, по крайней мере, содержит много повторяющихся значений. :limit
применяется после :sort
, поэтому он может легко выбирать результаты только с одним или двумя значениями для totalcount
. Без дополнительного ключа сортировки вы можете получить результаты, которые выглядят случайными, даже если они (частично) отсортированы.
Каждый раз, когда вы используете ключ сортировки, который может иметь повторяющиеся значения, вы обычно хотите включить вторичный ключ сортировки для разумной сортировки в первичных группах.