2017-06-13 92 views
0

我无法使用索引优化不同的查询。不同于使用覆盖查询的索引

我收集这个样子的:

{ 
     "_id" : ObjectId("592ed92296232608d00358bd"), 
     "measurement" : ObjectId("592ed92196232608d0034c23"), 
     "loc" : { 
       "coordinates" : [ 
         2.65939299848366, 
         50.4380671935187 
       ], 
       "type" : "Point" 
     }, 
     "elements" : [ 
       ObjectId("592ed92196232608d0034c24"), 
       ObjectId("592ed92196232608d0034c26"), 
       ObjectId("592ed92196232608d0034c28") 
     ] 
} 

我试图执行像

db.mycol.distinct('elements', { 
    $and:[ 
     measurement:{ 
     $in:[ 
      ObjectId("592ed92196232608d0034c23"), 
      ObjectId("592ed92196232608d0034c24") 
     ] 
     }, 
     { 
     loc:{ 
      $geoWithin:{ 
       $geometry:{ 
        type:'Polygon', 
        coordinates:[[ 
        [ 
         2.0214843750000004, 
         50.25071752130677 
        ], 
        [ 
         2.0214843750000004, 
         50.65294336725709 
        ], 
        [ 
         3.0487060546875004, 
         50.65294336725709 
        ], 
        [ 
         3.0487060546875004, 
         50.25071752130677 
        ], 
        [ 
         2.0214843750000004, 
         50.25071752130677 
        ] 
       ]] 
       } 
      } 
     } 
     } 
    ] 
}) 

查询和我有这样的指标:

{ 
    measurement: 1, 
    loc: '2dsphere', 
    elements: 1 
} 

查询计划( db.mycol.explain().distinct(...))显示了一个IXSCAN,但查询花费了很长时间。我添加了索引,希望能使用Mongo covered query。美国商务部指出,

  • 所有查询的字段是一个指数的一部分,
  • 和所有字段中返回的结果是在相同的指数。

所以我猜我需要包括elements的索引。但根据查询执行时间,它没有使用它。

什么是为这样的查询索引集合的最佳方法是什么?

+0

在集合上创建多个'2dsphere'索引通常不是一个好主意。它实际上完全不支持聚合'$ geoNear'和其他'$ near'查询等操作。你应该选择你最常用的组合并坚持。 –

+0

要尝试让1个索引,并回来告诉你结果 –

+0

编辑。我只留下了包含“元素”的2个索引(不知道在哪里放置它,在最后还是在开始时,这没有记录)。这导致COLSCAN这次是 –

回答

1

涵盖的查询不适用于数组。

从问题中提到的同一页:上索引字段

限制的指标不能涵盖查询,如果:

  • 任何索引字段的任何集合中的文档包含一个数组。如果索引字段是一个数组,索引将成为一个多键索引,并且不支持涵盖的查询。
+0

完美。谢谢。 –

+0

此外,当试图处理这样的查询时,应该做什么以充分利用索引系统和mongo引擎? –

+0

这有点复杂。你可以将db.mycol.explain(“allPlansExecution”)。distinct('elements',{....})的结果添加到问题中(这可能需要一些时间,并且输出将会很长) ? –