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