【问题标题】:How to retrieve the last 100 documents with a MongoDB/Moped query?如何使用 MongoDB/Moped 查询检索最后 100 个文档?
【发布时间】:2014-01-17 20:21:20
【问题描述】:

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

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

如何检索最后 100 个?

【问题讨论】:

    标签: ruby mongodb mongoid


    【解决方案1】:

    我找到了解决方案,但您需要按降序对集合进行排序。如果您有字段 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);
    

    【讨论】:

      【解决方案2】:

      从技术上讲,查询不会找到前 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_field1 排序(我假设这意味着升序)。如何在升序排序的同时获得最后 100 个?
      猜你喜欢
      • 2021-03-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2017-08-03
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多