我正在使用Ruby Mongoid gem并尝试创建一个查询来从集合中检索最后100个文档。我想使用底层驱动程序(Moped)创建查询,而不是使用Mongoid。 Moped documentation仅提到如何检索前100条记录:
session[:my_collection].find.limit(100)
如何检索最后100个?
答案 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
total = session[:my_collection].find.count
session[:my_collection].find
.sort(:some_field => 1)
.skip(total - 100)
你必须检查total >= 100
并调整skip
参数,如果不是的话。我怀疑第一个解决方案会更快,但您应该将其与您的数据进行基准测试,以了解现实情况。