В моем приложении я хотел бы запросить элементы, которые находятся рядом (например, в пределах 5 км) с координатой, и я попытался использовать $ около для достижения этой цели. Быстро посмотрев, я подумал, что это сработало, но после того, как я его проверил, кажется, что запрос несколько неточный Вот моя установка:
Я выбрал 2 координаты, расположенные на расстоянии чуть менее 5 км друг от друга:
- 61,4644750214197, 23,8426943813556
- 61,497133399999996, 23,778528100000003
(По крайней мере, согласно таким инструментам, как , , , или , , расстояние между этими координатами должно составлять ~ 4,99 км)
- Я добавил одну из координат в пустую коллекцию "items":
db.items.insert({
"geo" : {
"type" : "Point",
"coordinates" : [
61.4644750214197,
23.8426943813556
]
}
});
- Я добавил индекс «2dsphere» в коллекцию, чтобы сделать возможными геопространственные запросы:
db.items.createIndex( { geo : "2dsphere" } )
- Наконец, я использовал другую координату с запросом $ 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, но вместо этого он равен 0. Даже если я установлю $ maxDistance на 7000, результат будет все равно 0, но если я установлю его на 8000, результат будет 1.
Я что-то не так делаю, или геопространственные запросы MongoDB (или просто $ Near Request?) Являются неточными? Если да, то есть ли лучший способ получить точные результаты для этого вида запроса? Я впервые имею дело с геопространственными запросами в MongoDB, поэтому, вероятно, есть тривиальное объяснение моей проблемы.
EDIT:
В основном я мечтал о функциональности, чтобы показать все элементы на карте в пределах X километров от текущего местоположения пользователя, и X может быть определено пользователем. Было бы неудобно, если бы элемент в пределах 5 км не был виден, даже если пользователь хочет отфильтровать элементы в пределах 7 км.
Я испробовал большинство вариантов выполнения этого запроса, например $ centerSphere , $ nearSphere и geoNear с похожими результатами. Кажется, все они утверждают, что расстояние между моими ранее упомянутыми координатами составляет где-то 7-8 км. Я начинаю думать либо: 1. Мне не хватает ключевой информации о том, как работают расстояния в целом, или 2. Просто невозможно решить мою проблему с mongodb . Ниже приведены мои запросы для других вариантов:
$ 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
}
)