MongoDB $ проблема точности запроса - PullRequest
0 голосов
/ 27 апреля 2018

В моем приложении я хотел бы запросить элементы, которые находятся рядом (например, в пределах 5 км) с координатой, и я попытался использовать $ около для достижения этой цели. Быстро посмотрев, я подумал, что это сработало, но после того, как я его проверил, кажется, что запрос несколько неточный Вот моя установка:

  1. Я выбрал 2 координаты, расположенные на расстоянии чуть менее 5 км друг от друга:

    • 61,4644750214197, 23,8426943813556
    • 61,497133399999996, 23,778528100000003

(По крайней мере, согласно таким инструментам, как , , , или , , расстояние между этими координатами должно составлять ~ 4,99 км)

  1. Я добавил одну из координат в пустую коллекцию "items":
db.items.insert({
    "geo" : {
        "type" : "Point",
        "coordinates" : [ 
            61.4644750214197, 
            23.8426943813556
        ]
    }
});
  1. Я добавил индекс «2dsphere» в коллекцию, чтобы сделать возможными геопространственные запросы:
db.items.createIndex( { geo : "2dsphere" } )
  1. Наконец, я использовал другую координату с запросом $ near:
db.items.find({geo: {
    $near: {
        $geometry: {
            type: "Point" ,
            coordinates: [ 61.497133399999996, 23.778528100000003 ]
        },
        $maxDistance: 5000 // according to docs with '2dsphere' index and GeoJSON this is is meters
    }
}}).count()
  1. Я ожидал, что результат будет 1, но вместо этого он равен 0. Даже если я установлю $ maxDistance на 7000, результат будет все равно 0, но если я установлю его на 8000, результат будет 1.

Я что-то не так делаю, или геопространственные запросы MongoDB (или просто $ Near Request?) Являются неточными? Если да, то есть ли лучший способ получить точные результаты для этого вида запроса? Я впервые имею дело с геопространственными запросами в MongoDB, поэтому, вероятно, есть тривиальное объяснение моей проблемы.

EDIT: В основном я мечтал о функциональности, чтобы показать все элементы на карте в пределах X километров от текущего местоположения пользователя, и X может быть определено пользователем. Было бы неудобно, если бы элемент в пределах 5 км не был виден, даже если пользователь хочет отфильтровать элементы в пределах 7 км.

Я испробовал большинство вариантов выполнения этого запроса, например $ centerSphere , $ nearSphere и geoNear с похожими результатами. Кажется, все они утверждают, что расстояние между моими ранее упомянутыми координатами составляет где-то 7-8 км. Я начинаю думать либо: 1. Мне не хватает ключевой информации о том, как работают расстояния в целом, или 2. Просто невозможно решить мою проблему с . Ниже приведены мои запросы для других вариантов:

$ centerSphere (0 результатов с 5, 6 и 7 км, но 1 результат с 8 км):

db.items.find( { geo: { 
        $geoWithin: { $centerSphere: [ [ 61.497133399999996, 23.778528100000003 ], 5/6378.1 ] 
    }
}}).count()

geoNear (0 результатов с maxDistance 5000, 6000 и 7000, но 1 результат с 8000):

db.runCommand(
   {
     geoNear: "items",
     near: { type: "Point", coordinates: [ 61.497133399999996, 23.778528100000003 ] },
     spherical: true,
     maxDistance: 5000
   }
)

1 Ответ

0 голосов
/ 18 марта 2019

Я понимаю, что опаздываю на вечеринку, но для всех тех, кто сталкивается с подобной проблемой

Проблема здесь в том, что когда вы сохраняете эти данные в «координатах», они должны иметь порядок [долгота, широта] , потому что именно так работает mongodb. https://docs.mongodb.com/manual/geospatial-queries/#spherical Я просто запустил ваш пример с обратным порядком координат, и он работал как ожидалось.

db.items.insert({
    "geo" : {
        "type" : "Point",
        "coordinates" : [ 
            23.8426943813556,
            61.4644750214197
        ]
    }
});

А потом я побежал

db.items.find({geo: {
    $near: {
        $geometry: {
            type: "Point" ,
            coordinates: [  23.778528100000003 , 61.497133399999996]
        },
        $maxDistance: 5000
    }
}}).count()

Количество здесь 1:

Надеюсь, это поможет

...