0

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

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

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

有什么想法吗?

4

2 回答 2

2

我认为在完全回答您的问题之前给您一些背景信息对我很有用:

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

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

1) 查询field1

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。我希望整个文档对您非常有用。

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

希望这可以帮助!

于 2012-09-06T19:44:00.393 回答
0

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

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

于 2012-09-06T19:53:49.970 回答