代码之家  ›  专栏  ›  技术社区  ›  maddie

Mongodb:在只有默认索引(_id)的集合上使用min函数

  •  0
  • maddie  · 技术社区  · 4 年前

    我想以高效的方式检索我的大型收藏中的最后20个文档。

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

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

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

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

    有什么方法可以使用吗 min _id 指数?还是我创建新索引的唯一选择?

    1 回复  |  直到 4 年前
        1
  •  0
  •   Joe    4 年前

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

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