首页 > 解决方案 > 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?还是我唯一的选择是创建一个新索引?

标签: javascriptdatabasemongodbsorting

解决方案


是的,您可以使用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)

这不使用索引,但它应该仍然具有相当的性能,因为它只会扫描您想要返回的文档数量。


推荐阅读