我有一个通过PHP创建的mongoDB集合。现在我想索引几个字段,但是php文档没有讨论如何不对索引应用排序!
例如,我想索引field1,field2,field3,并按字段3排序整个事物。
因为我将基于field1,field2搜索集合,所以我想确保它们具有索引,但是当集合从find()操作返回时,我只是希望它按字段3排序。
有什么想法吗?
答案 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组合,那么该索引将无助于排序;在这种情况下,将需要内存中的排序。