Ruby / Mongodb排序项降序排列

时间:2012-03-19 00:05:24

标签: ruby sorting mongodb

我有一个非常简单的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)

此查询不会以desc顺序返回项目。我通过扫描结果集知道记录看起来是未排序的事实。

有没有人有任何想法?

1 个答案:

答案 0 :(得分:2)

你所做的对我来说很好,它应该有用。

但是,如果您只有有限数量的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听起来像没有那么多值的东西,至少会包含许多重复的值。 <{1}}在<{em> :limit后应用,因此可以轻松选择只有一个或两个:sort值的结果。如果没有辅助排序键,即使它们(部分)排序,您也可以获得看起来随机的结果。

每当您使用可以具有重复值的排序键时,您通常希望包含辅助排序键,以便对主要组内的事物进行合理排序。