2013-09-30 3 views
3

У меня есть коллекция называемой Search2 примерно 20000 документов подобные:MongoDb geoIntersects не использует IndexOnly

{ 
     "loc": { 
     "type": "Polygon", 
     "coordinates": [ 
      [ 
      [ 
       43.78526674007639, 
       11.14739998758569 
      ], 
      [ 
       43.78526674007639, 
       11.183372851822439 
      ], 
      [ 
       43.79443488391605, 
       11.183372851822439 
      ], 
      [ 
       43.79443488391605, 
       11.264311796355125 
      ], 
      [ 
       43.812771171595415, 
       11.264311796355125 
      ], 
      [ 
       43.83110745927479, 
       11.264311796355125 
      ], 
      [ 
       43.83110745927479, 
       11.273305012414314 
      ], 
      [ 
       43.849443746954144, 
       11.273305012414314 
      ], 
      [ 
       43.858611890793824, 
       11.273305012414314 
      ], 
      [ 
       43.858611890793824, 
       11.264311796355125 
      ], 
      [ 
       43.8769481784732, 
       11.264311796355125 
      ], 
      [ 
       43.8769481784732, 
       11.246325364236752 
      ], 
      [ 
       43.88611632231286, 
       11.246325364236752 
      ], 
      [ 
       43.88611632231286, 
       11.237332148177565 
      ], 
      [ 
       43.895284466152546, 
       11.237332148177565 
      ], 
      [ 
       43.895284466152546, 
       11.228338932118376 
      ], 
      [ 
       43.904452609992234, 
       11.228338932118376 
      ], 
      [ 
       43.904452609992234, 
       11.165386419704065 
      ], 
      [ 
       43.895284466152546, 
       11.165386419704065 
      ], 
      [ 
       43.895284466152546, 
       11.156393203644878 
      ], 
      [ 
       43.88611632231286, 
       11.156393203644878 
      ], 
      [ 
       43.8769481784732, 
       11.156393203644878 
      ], 
      [ 
       43.858611890793824, 
       11.156393203644878 
      ], 
      [ 
       43.849443746954144, 
       11.156393203644878 
      ], 
      [ 
       43.849443746954144, 
       11.165386419704065 
      ], 
      [ 
       43.83110745927479, 
       11.165386419704065 
      ], 
      [ 
       43.83110745927479, 
       11.156393203644878 
      ], 
      [ 
       43.812771171595415, 
       11.156393203644878 
      ], 
      [ 
       43.812771171595415, 
       11.14739998758569 
      ], 
      [ 
       43.79443488391605, 
       11.14739998758569 
      ], 
      [ 
       43.78526674007639, 
       11.14739998758569 
      ] 
      ] 
     ] 
     }, 
     "docId": 1, 
     "docVote": 0, 
     "title": "title-1", 
     "_id": { 
     "$oid": "5248725d2dd5622510000001" 
     } 
    } 

I определение индекса с помощью команды:

db.search2.ensureIndex({"loc":"2dsphere"}); 

На коллекции есть только этот индекс и индекс по умолчанию в поле «_id».

Когда я выполнить следующий запрос я ожидать, что параметр indexOnly от объясняет быть истинна: ​​

db.search2.find({ 
     loc: { 
     $geoIntersects: { 
      $geometry: { 
      type: "Polygon", 
      coordinates: [ 
       [ 
        [43.7269795, 11.1540365], 
        [43.7269796, 11.1540365], 
        [43.7269796, 11.1540366], 
        [43.7269795, 11.1540366], 
        [43.7269795, 11.1540365] 
       ] 
      ] 
      } 
     } 
     } 
    }, { 
     loc: 1, 
     _id: 0 
    }).hint({"loc":"2dsphere"}).explain() 

Но это результат:

{ 
     "cursor" : "S2Cursor", 
     "isMultiKey" : true, 
     "n" : 14, 
     "nscannedObjects" : 14, 
     "nscanned" : 186, 
     "nscannedObjectsAllPlans" : 14, 
     "nscannedAllPlans" : 186, 
     "scanAndOrder" : false, 
     "indexOnly" : false, 
     "nYields" : 0, 
     "nChunkSkips" : 0, 
     "millis" : 20, 
     "indexBounds" : { 

     }, 
     "nscanned" : 186, 
     "matchTested" : NumberLong(80), 
     "geoTested" : NumberLong(80), 
     "cellsInCover" : NumberLong(1), 
     "server" : "*******" 
    } 

Я заметил, что isMultiKey верно, вызванный синтаксисом многоугольников документов. Курсор - это S2Cursor, поэтому я полагаю, что этот индекс использовался. Но почему indexOnly является ложным? Из-за синтаксиса многоугольника? так что невозможно иметь IndexOnly = true? Заранее спасибо

ответ

0

indexOnly объяснения от here состояний:

indexOnly это логическое значение, которое возвращает истину, если запрос покрывается индексом, указанный в поле курсора. Когда индекс покрывает запрос, MongoDB может и соответствовать условиям запроса и возврат результатов, используя только индекс, так как:

  • всех поля в запросе, являются частью этого индекса, и

  • все поля в запросе, являются частью этого индекса, и

и от here говорится:

Индекс не может покрыть запрос, если:

  • любой из индексированных полей в какой-либо из документов в коллекции включает в себя массив. Если индексированное поле является массивом, индекс становится индексом индекса с несколькими ключами и не может поддерживать закрытый запрос.
  • любое из проиндексированных полей - это поля в поддокументах.

Надеется, что это помогает

+0

Я согласен с вами, но как я могу сделать запрос, использовать $ geoIntersects и где indexOnly верно? Из документации это кажется невозможным. Это правда? Спасибо – MarcoBiagi

+0

Из документации я получил тот же вывод, что и индексы multiKey не могут охватить запрос. – fgakk

+0

Я думаю, что мне нужно сообщить об этом mongodb jira ... – MarcoBiagi

Смежные вопросы