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"});
Другие вопросы по тегам