【发布时间】:2014-01-17 20:21:20
【问题描述】:
我正在使用 Ruby Mongoid gem 并尝试创建一个查询来检索集合中的最后 100 个文档。我不想使用 Mongoid,而是想使用底层驱动程序 (Moped) 创建查询。 Moped documentation 仅提及如何检索前 100 条记录:
session[:my_collection].find.limit(100)
如何检索最后 100 个?
【问题讨论】:
我正在使用 Ruby Mongoid gem 并尝试创建一个查询来检索集合中的最后 100 个文档。我不想使用 Mongoid,而是想使用底层驱动程序 (Moped) 创建查询。 Moped documentation 仅提及如何检索前 100 条记录:
session[:my_collection].find.limit(100)
如何检索最后 100 个?
【问题讨论】:
我找到了解决方案,但您需要按降序对集合进行排序。如果您有字段 id 或日期,您会这样做:
方法 .sort({fieldName: 1 or -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);
【讨论】:
从技术上讲,查询不会找到前 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 参数。我怀疑第一个解决方案会更快,但您应该用您的数据对其进行基准测试,看看实际情况如何。
【讨论】:
:some_field 按1 排序(我假设这意味着升序)。如何在升序排序的同时获得最后 100 个?