【问题标题】:Is is possible to create mongoDB indexes that are not sorted?是否可以创建未排序的 mongoDB 索引?
【发布时间】:2012-09-06 18:45:12
【问题描述】:

我有一个通过 PHP 创建的 mongoDB 集合。现在我想索引几个字段,但是 php 文档没有讨论如何不对索引应用排序!

例如,我想对 field1、field2、field3 进行索引,并让整个事物按 field3 排序。

由于我将根据 field1、field2 搜索集合,因此我想确保它们具有索引,但是当集合从 find() 操作返回时,我只想按 field3 对其进行排序。

有什么想法吗?

【问题讨论】:

    标签: php mongodb


    【解决方案1】:

    我认为在完全回答您的问题之前,先向您提供一些背景信息会很有用:

    当 mongo 在集合上创建索引时,它本质上是根据索引键对集合进行排序。因此,当您从使用索引的查询中获取结果时,结果将按该索引的键排序。如果您的查询使用 field1 上的基本索引,则根据定义,结果将按该索引排序。

    不过,有几种方法可以解决这个问题。一种简单的方法是

    1) 查询字段1

    2) 使用 field3 对 1) 的结果进行排序

    如果我正确理解您的评论,这将为您提供所需的输出。但是,它的缺点是需要 2 项主要工作,根据数据的大小,这可能会很昂贵。

    还有另一种方法可以解决您的问题:复合索引。复合索引使用多个键来生成基于这两个键排序的索引。这里有一些文档:http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys 如果您想更深入地研究这个主题,还有很多关于复合索引的堆栈溢出问题。

    此外,如果您想了解有关 mongodb 中索引(和复合索引)的一般信息,请查看 http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex。我希望整个文档对你很有用。

    使用复合索引虽然优雅且合适,但肯定比在查询后使用排序更复杂。如果您愿意花时间研究它,但我相信您会发现它会帮助您找到一个不错的解决方案。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      不,您不能将复合索引的整体排序顺序与单个索引组件的排序顺序分开。

      因此,在您的示例中,对 field1、field2 的查询以及对 field3 的排序将需要复合 field1、field2、field3 索引来支持索引辅助排序。但是,如果结果中返回了多个 field1,field2 组合,则该索引将无助于排序;在这种情况下,需要进行内存排序。

      【讨论】:

        猜你喜欢
        • 2017-05-24
        • 2014-08-14
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 2011-02-11
        • 1970-01-01
        • 2012-09-09
        • 1970-01-01
        相关资源
        最近更新 更多