javascript - Mongodb:在只有默认索引(_id)的集合上使用 min 函数
问题描述
我想以有效的方式检索大型集合中的最后 20 个文档。
这个 SO帖子提供了这个高性能的解决方案 -但它没有回答我的问题,因为我的问题是专门处理 _id 索引- :
db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)
但是,我的集合只包含默认索引 ( _id
)。我只是不确定最低标准是什么——我显然不想硬编码一个_id
值,因为集合会定期清空。
itemsCollection.find().min(<minCriteria>).hint({_id:1}).limit(20)
有没有办法使用min
索引_id
?还是我唯一的选择是创建一个新索引?
解决方案
是的,您可以使用min
_id 索引,只要您<minCriteria>
只引用 _id 字段。
如果您的最小标准不是 _id,您将需要在该标准上创建一个索引,以避免此查询成为完整的集合扫描。
游标方法用于为将为查询提供服务的min()
索引扫描建立一个下限。这可能不是您要检索最近添加的文档的内容。
假设每个文档的_id
字段包含一个ObjectId或按插入顺序排序的其他值,那么您可以如注释中所述,对 _id 进行反向排序并限制所需的文档数量,这可能非常有效.
此查询应自动使用_id
索引:
db.itemsCollection.find().sort({_id:-1}).limit(20)
ObjectId 的日期部分由创建值的系统确定,在某些情况下是客户端/应用程序服务器。这意味着时钟漂移可能会影响排序。
如果要获取最近插入到集合中的文档,可以使用自然顺序:
db.itemsCollection.find().sort({$natural:-1}).limit(20)
这不使用索引,但它应该仍然具有相当的性能,因为它只会扫描您想要返回的文档数量。
推荐阅读
- cmake - 安装 Foonathan 内存依赖项时出错
- javascript - 如何在本机反应中在单个按钮上一一调用多个功能
- snowflake-cloud-data-platform - 雪花中的 ISO 本周迄今
- css - 如何在我的反应 js 页面中应用媒体查询
- python - Pandas:read_csv 读取没有 NaN 的大型 csv 文件
- encryption - Keycloak Saml 加密和解密断言
- c# - WebView2 无法打印嵌入 pdf 数据的 html 文档(base64)
- sql-server - 部署包时出错 SQL Server 不支持区域设置标识符 (LCID)
- javascript - 如何在 Angular 项目中包含 popper.js 和 bootstrap.js
- javascript - 如何获取任何 SVG 元素的四个角坐标(SVG 坐标)?