【问题标题】:Mongodb: using min function on collection with only default index (_id)Mongodb:在只有默认索引(_id)的集合上使用 min 函数
【发布时间】:2023-03-06 16:53:02
【问题描述】:

我想以有效的方式检索大型集合中的最后 20 个文档。

这个 SO post 提供了这个高性能的解决方案 - 但它没有回答我的问题,因为我的问题是专门处理 _id 索引 - :

db.collectionName.find().min(minCriteria).hint(yourIndex).limit(N)

但是,我的集合只包含默认索引 (_id)。我只是不确定最低标准是什么 - 我显然不想硬编码 _id 值,因为该集合会定期清空。

itemsCollection.find().min(<minCriteria>).hint({_id:1}).limit(20)

有没有办法将min_id 索引一起使用?还是我唯一的选择是创建一个新索引?

【问题讨论】:

  • 您使用的 MongoDB 版本是什么?它是集群(副本集、分片)还是独立的?
  • @prasad_ 三节点副本集
  • docs 说“min() 的存在主要是为了支持 mongos 进程”;那么你的用例是什么?您是否在寻找性能(“我想以有效的方式检索我的大型集合中的最后 20 个文档。”)?您正在寻找什么功能?
  • 最高效的方式
  • 您能否运行db.collection.find({}).sort({ _id: -1 }).limit(20).explain("executionStats") 并告诉我们您通过executionTimeMillis 获得了什么价值

标签: javascript database mongodb sorting


【解决方案1】:

是的,您可以将min 与_id 索引一起使用,只要您的&lt;minCriteria&gt; 仅引用_id 字段。

如果您的最小条件不是 _id,则需要根据该条件创建索引,以避免此查询成为完整的集合扫描。

min() 游标方法用于为将为查询提供服务的索引扫描建立下限。这可能不是您要检索最近添加的文档的内容。

假设每个文档的_id 字段包含一个ObjectId 或其他按插入顺序排序的值,那么您可以如 cmets 中所述,对 _id 进行反向排序并限制所需的文档,这可能非常有效。

这个查询应该自动使用_id 索引:

db.itemsCollection.find().sort({_id:-1}).limit(20)

ObjectId 的日期部分由创建值的系统确定,在某些情况下是客户端/应用程序服务器。这意味着时钟漂移可能会影响排序。

如果要获取最近插入到集合中的文档,可以使用自然顺序:

db.itemsCollection.find().sort({$natural:-1}).limit(20)

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

【讨论】:

  • 您能提供一个最低标准的例子吗?
  • 这取决于集合中的文档,您必须指定与您要使用的索引匹配的条件。见docs.mongodb.com/manual/reference/method/cursor.min/…
  • 对不起,我的问题没有提出,我原来的帖子解释说,最低标准是 - 我显然不想硬编码 _id 值,因为集合会定期清空。所以我想知道是否可以在仅使用 _id 索引的集合上使用 min - 此外,在这种情况下,min 标准是什么?最小标准不仅仅是硬编码的_id吗?这似乎并不高效
  • 我应该立即认识到 XY 问题。我将编辑问题以解决主要目标。
猜你喜欢
  • 1970-01-01
  • 2013-08-25
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
相关资源
最近更新 更多