根据条件查找第 N 个文档

Posted

技术标签:

【中文标题】根据条件查找第 N 个文档【英文标题】:Find Nth document based on condition 【发布时间】: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的答案也很感激 我不相信你可以在一个查询中做到这一点。如果您的应用程序相对较小,我不会担心性能。稍后调整 【参考方案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​​ 代码:)

以上是关于根据条件查找第 N 个文档的主要内容,如果未能解决你的问题,请参考以下文章

如何在特定字段 MongoDB 上查找 Distinct No of Document 并根据条件打印文档数?

第3章 Linux常用命令_文件搜索命令

根据结构列表上的条件查找 FirstOrDefault

根据2个条件使用HLOOKUP查找值

SQL:查找第 n 个客户的第 n 个订单

使用 spark 和 scala 根据总时间查找每个 ID 的前 N ​​个游戏