2013-03-18 77 views
0

这是使用mongodb 2.0.4。我们曾想过升级,但只想看看我们是否可以在不这样做的情况下解决这个问题,因为我们的设置升级并不容易。创建日期范围(和其他字段)的覆盖索引

我有很多更新的查询在“查找”部分看起来是这样的:

timestamp: 
{ 
    $gte: ISODate('xxxxx'), 
    $lt: ISODate('xxxxx') 
}, 
id: "string" 
processed: false 

它基本上是搜索记录的特定日期范围为特定的ID内,并从错误处理,以真正的更新(这是一个“工人”过程)。

我试着创建一个包含所有3个字段(以及_id)的索引,但explain()仍然返回indexOnly: false。奇怪的是它也返回此为indexBounds:

"indexBounds" : { 
    "processed" : [ 
     [ 
      false, 
      false 
     ] 
    ] 
} 

有人可以给我一个提示,如何解决这个问题,从而正确的MongoDB使用索引(覆盖索引)或日期范围是根本不可能的?

+0

您尝试创建哪些索引,并将涵盖的查询应用于完整的光标,而不仅仅是查找条件,也就是说,您的返回文档还必须只是索引字段。 – Sammaye 2013-03-18 09:43:27

+0

Sammaye:我知道返回文档的事情,但在这种情况下,它是一个更新,其唯一更新是设置“processed:false”,因此应该被覆盖。试图创建一个包含3个字段(时间戳,ID,处理)以及_id的索引,但它没有显示为覆盖。 – 2013-03-18 13:54:44

+0

没有更新将被覆盖,这是不可能的,一个被覆盖的查询只能存在于一个查找中。如果这就是你的意思,$ set可以在文档中进行原子操作? – Sammaye 2013-03-18 13:57:40

回答

0

最重要的是不只是具有三个字段的索引,但什么为了领域都在。

我建议这个article,以获取有关如何复合索引使用更多的细节。

需要记住的重要一点是,测试平等的字段必须位于测试范围的字段之前(特别是因为您的版本是旧的,没有进行某些优化更高版本)。

+0

我开始越来越多地认为,我们正在拼命地忽略一些非明显的,没有记录的内部优化,按照字段的顺序以及它们如何处理索引,只是简单地在后面几个版本。我读了一篇与你相关的文章的类似文章,这真是令人大开眼界。 – 2013-03-21 05:58:11

+0

我非常肯定你需要注意的所有优化都有记录:) – 2013-03-21 06:06:31