t-alexashka
@t-alexashka
Сразу пишу legacy код

Почему mongodb не находит гео-точку?

Всем доброго вечера!

У меня есть документ у которого координаты в центре Москвы (ЦУМ), я на его переменную loc добавил индекс 2dsphere и все без ошибок. Но при попытке найти его через $box (область поиска - вся мск), mongo не возвращает ничего. Что я делаю не так?

Вот документ:

3b7bd5c86d494e139159b8388cf7b6d6.PNG

Вот поисковый запрос:

d53516d294c64a218e279f9da38c4d27.PNG

$within менял на $geoWithin, lat и lon менял местами уже. Ничего не помогает...
Спасибо.
  • Вопрос задан
  • 2554 просмотра
Решения вопроса 1
nowm
@nowm
Edit: удалил весь предыдущий текст.

Суть в том, что для $box нужно задавать координаты таким образом:
$box: [
    [ <нижний левый угол> ],
    [ <верхний правый угол> ]
]


При этом, сначала должна указываться долгота (longtitude), а потом широта (latitude). Для Москвы долгота, грубо говоря, — 37, а широта — 55 (опять же, в грубом приближении).

Чтобы понять, где будет находиться нижний левый и верхний правый углы, нужно представить всю ситуацию так: плюсовая долгота начинается от Лондона и идёт вправо. Плюсовая широта начинается от экватора и идёт вверх. Значит точка с координатами (0, 0) будет находиться левее и ниже Москвы. В левом нижнем углу будут минимальные широта и долгота, а в правом верхнем углу — максимальные широта и долгота.

Чтобы сделать правильные координаты для $box, нужно для левого нижнего угла взять минимальные значения широты и долготы — [36.362, 55.38691], а для верхнего правого — максимальные, [38.573, 56.00606]. В итоге, этот запрос охватывает точку, которую вы искали:

db.places.find({
    loc: {
        $within: {
            $box: [
                [36.362, 55.38691], 
                [38.573, 56.00606]
            ]
        } 
    } 
})


На моей машине, во всяком случае, он нормально работает, и нужная точка попадает в диапазон.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы