Как сделать запрос ограничивающего прямоугольника с MongoDB? - PullRequest
0 голосов
/ 29 октября 2018

Не получается получить ограничивающий запрос, работающий с MongoDB, который на самом деле использует пространственный индекс.

Вот мои индексы:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "LatLong" : "2dsphere"
        },
        "name" : "LatLong_2dsphere",
        "ns" : "config.Listings",
        "2dsphereIndexVersion" : 3
    },
    {
        "v" : 2,
        "key" : {
            "ListingId" : 1
        },
        "name" : "ListingId",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "Category" : 1,
            "Status" : 1
        },
        "name" : "Category_and_Status",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "Category" : 1,
            "Status" : 1,
            "Suburb" : 1
        },
        "name" : "Basic_Suburb_Search",
        "ns" : "config.Listings"
    },
    {
        "v" : 2,
        "key" : {
            "LatLong.Coordinates" : "2d"
        },
        "name" : "LatLong.Coordinates_2d",
        "ns" : "config.Listings"
    }
]

У меня изначально был индекс 2dsphere, но потом я увидел этот ответ , говорящий, что блочные запросы работают только с 2d индексами.

Когда я пытаюсь выполнить запрос box, он не использует ни один из индексов:

db.Listings.find( {
   LatLong: { $geoWithin: { $box:  [ [ 144.9941034, -37.8220633 ], [ 145.0551353, -37.79494 ] ] } }
} ).explain()

Он возвращает результаты, но COLLSCAN и очень медленный.

Я тоже пробовал это:

db.Listings.find( {
   "LatLong.coordinates": { $geoWithin: { $box:  [ [ 144.9941034, -37.8220633 ], [ 145.0551353, -37.79494 ] ] } }
} )

Тот же результат - возвращает данные, но выполняет COLLSCAN.

LatLong является GeoJSON объектом. Вот пример документа:

{
    "_id" : ObjectId("5bd64f2274cb40f172a328fb"),
    "LatLong" : {
        "type" : "Point",
        "coordinates" : [ 
            151.2504, 
            -33.96767
        ]
    },
    // other props removed for simplicity
}

Может кто-нибудь сказать мне, что я делаю не так?

...