是否可以创建未排序的mongoDB索引?

时间:2012-09-06 18:45:12

标签: php mongodb

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

例如,我想索引field1,field2,field3,并按字段3排序整个事物。

因为我将基于field1,field2搜索集合,所以我想确保它们具有索引,但是当集合从find()操作返回时,我只是希望它按字段3排序。

有什么想法吗?

2 个答案:

答案 0 :(得分: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。这整篇文档对我来说应该是非常有用的。

使用复合索引虽然优雅且恰当,但绝对比在查询后使用sort更复杂。如果你愿意花时间研究它,虽然我相信你会发现它会帮助你找到一个很好的解决方案。

希望这有帮助!

答案 1 :(得分:0)

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

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