如何使用MongoDB / Moped查询检索最后100个文档?

时间:2014-01-17 20:21:21

标签: ruby mongodb mongoid

我正在使用Ruby Mongoid gem并尝试创建一个查询来从集合中检索最后100个文档。我想使用底层驱动程序(Moped)创建查询,而不是使用Mongoid。 Moped documentation仅提到如何检索前100条记录:

session[:my_collection].find.limit(100)

如何检索最后100个?

2 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,但您需要按降序对集合进行排序。如果您有字段ID或日期,则可以:

方法.sort({fieldName:1或-1})

1将按升序排序(从最旧到最新),-1将按降序排序(从最新到最旧)。这将反转您的收藏品的条目。

session[:my_collection].find().sort({id:-1})  or
session[:my_collection].find().sort({date:-1})

如果您的集合包含标识符嵌入了日期的字段ID(_id),那么您可以使用

session[:my_collection].find().sort({_id:-1})

根据您使用.limit()的示例,完整的查询将是:

session[:my_collection].find().sort({id:-1}).limit(100);

答案 1 :(得分:0)

从技术上讲,查询没有找到前100个,这实际上是找到100个随机文档,因为您没有指定订单。如果你想要第一个,那么你必须明确地说sort

session[:my_collection].find.sort(:some_field => 1).limit(100)

并反转顺序以查找与:some_field相关的最后100个:

session[:my_collection].find.sort(:some_field => -1).limit(100)
# -----------------------------------------------^^

当然,你已经决定了:some_field将会是什么,所以“第一”和“最后”对你有意义。

如果你希望它们按:some_field排序,但想要剥离最后的100,那么你可以在Ruby中反转它们:

session[:my_collection].find
                       .sort(:some_field => -1)
                       .limit(100)
                       .reverse

或者您可以使用count来查找有多少skip来抵消结果:

total = session[:my_collection].find.count
session[:my_collection].find
                       .sort(:some_field => 1)
                       .skip(total - 100)

你必须检查total >= 100并调整skip参数,如果不是的话。我怀疑第一个解决方案会更快,但您应该将其与您的数据进行基准测试,以了解现实情况。