2017-06-13 9 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'、{....})'の結果を追加できますか(時間がかかることがあり、出力がかなり長くなるでしょう) ? –

関連する問題