我有一个非常简单的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顺序返回项目。我通过扫描结果集知道记录看起来是未排序的事实。
有没有人有任何想法?
答案 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
值的结果。如果没有辅助排序键,即使它们(部分)排序,您也可以获得看起来随机的结果。
每当您使用可以具有重复值的排序键时,您通常希望包含辅助排序键,以便对主要组内的事物进行合理排序。