Mongodb Geospatial index не поддерживает $box?
Я создаю индекс 2dsphere и пытаюсь использовать его для своих геопространственных запросов. Тем не менее, я обнаружил, что когда я использую $geoWithin.$ Box, он не использует индекс, следовательно, очень медленный. Если я использую геометрию $geoWithin.$, То будет использоваться индекс. В документе написано, что $ box поддерживает index, поэтому я должен что-то пропустить. Любая идея?
Геопространственный индекс
{
"v" : 1,
"key" : {
"details.lonlat" : "2dsphere"
},
"name" : "longlat",
"ns" : "realestate.property",
"2dsphereIndexVersion" : 2
}
Запрос с полигоном GeoJSON использует индекс
> db.property.find({'details.lonlat': {'$geoWithin': {$geometry: {type:'Polygon', coordinates: [[[1,1],[2,2],[3,3], [1,1]]]}}}}).explain()
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"details.lonlat" : "2dsphere"
},
...
Использование $ box не использует индекс, но сканирует коллекцию (почему?)
> db.property.find({'details.lonlat': {'$geoWithin': {'$box': [[ 0, 0 ], [ 100, 100 ] ]}}}).explain()
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
"details.lonlat" : {
"$geoWithin" : {
"$box" : [
[
0,
0
],
[
100,
100
]
]
}
}
},
"direction" : "forward"
Mongodb Info
"version" : "3.0.4",
"gitVersion" : "0481c958daeb2969800511e7475dc66986fa9ed5"
1 ответ
Решение
2dsphere не поддерживает запрос $box. Вот почему ваш запрос падает до полной проверки коллекции.
В документации к коробке указано следующее:
Only the 2d geospatial index supports $box
Добавление 2d-индекса должно помочь, например:
db.property.ensureIndex({"details.lonlat": "2d"});