【问题标题】:Find Nth document based on condition根据条件查找第 N 个文档
【发布时间】:2021-10-21 16:48:34
【问题描述】:

如果文档总数超过 N,则获取第 N 个文档。如果小于 N,则获取最后一个文档。

如何为此编写查询?

一种方法可以是

N = 100
query = {} # some other conditions
Model.where(query).limit(N).to_a.last
# This is inefficient as it fetches all N documents

Model.where(query).limit(N).last
# This doesn't work since .last translates to .limit(1) and replaces .limit(N)

Model.where(query).skip(N-1).first
# this doesn't work when total number of documents is less than N


m = Model.where(query).skip(N-1).first
m = Model.where(query).last if !m
# This works but can we do it in a single query?

【问题讨论】:

  • 任何纯粹基于mongo的答案也很感激
  • 我不相信你可以在一个查询中做到这一点。如果您的应用程序相对较小,我不会担心性能。稍后调整

标签: ruby-on-rails mongodb mongodb-query


【解决方案1】:

假设我们有 N=21

var res= DB.collection.find().limit(21);

res[res.length-1] // which is equivalent to res.last
  • 如果您匹配了 10 条记录: 然后 res 将有 10 条记录,当结果 size(10) 小于 N(21) 时,您将得到 res[9] 是最后一个元素

  • 如果您匹配了 30 条记录:那么 res 将有 21 条记录(因为限制为 N(21)),并且当结果 size(21) 小于 N(21) 时,您将获得 res[20] 这是最后一个元素

  • 如果您匹配了 21 条记录:那么 res 将有 21 条记录(因为限制是 N(21))并且当结果 size(21) 小于 N(21) 时,您将得到 res[20] 这是最后一个元素

【讨论】:

  • 谢谢。正如我所提到的,我已经知道这种方法,尽管它是在 ruby​​ 语言中。这种方法的问题是它会获取所有 21 个文档,当 N 变大或单个文档大小很大时,这是一个问题
  • 好的,下面一个怎么样? var size=9 db.collection.find({}).skip((db.collection.find({}).limit(size).count(1)) - 1).limit(1) 对不起,我只能分享适用于您的情况的 mongo shell 命令.....这里的逻辑是动态查找并跳过所有匹配的文档,但 1. 通常您需要的只是 db.collection.find({}).skip(n-1如果 total 为 ,则为 total-1
  • 我相信您可以轻松地将上面的 mongo shell sn-p 转换为等效的 ruby​​ 代码:)
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多