Как сделать запрос ограничивающего прямоугольника с MongoDB?
Я не могу получить ограничивающий запрос, работающий с 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
Индекс, но потом я увидел этот ответ, сказав, что запросы box работают только с 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
}
Может кто-нибудь сказать мне, что я делаю не так?