Ruby / Mongodb сортировка элементов по убыванию - PullRequest
0 голосов
/ 19 марта 2012

У меня действительно простая коллекция Mongodb, например

{ "_id" : ObjectId("objid"), "url" : "http://mydomain.com", "datestamp" : ISODate("2012-03-17T02:00:45.119Z"), "totalcount" : 1 }

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

@globallinks = Mongo::Connection.new.db("mydb").collection("mycollect")
@toplinks = @globallinks.find({}, :sort => ["totalcount", Mongo::DESCENDING], :limit => 100)

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

У кого-нибудь есть идеи?

1 Ответ

2 голосов
/ 19 марта 2012

То, что вы делаете, прекрасно работает для меня, и оно должно работать.

Однако, если у вас есть только ограниченное количество значений 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. Без дополнительного ключа сортировки вы можете получить результаты, которые выглядят случайными, даже если они (частично) отсортированы.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...