MongoDB предоставляет агрегатор $geoNear для расчета расстояния до документов в коллекции с координатами GeoJson.
Давайте разберемся с этим на простом примере. Рассмотрим простые коллекционные магазины
1. Создать коллекцию
db.createCollection('shops')
2. Вставка документов в коллекции магазинов
db.shops.insert({name:"Galaxy store",address:{type:"Point",coordinates:[28.442894,77.341299]}})
db.shops.insert({name:"A2Z store",address:{type:"Point",coordinates:[28.412894,77.311299]}})
db.shops.insert({name:"Mica store",address:{type:"Point",coordinates:[28.422894,77.342299]}})
db.shops.insert({name:"Full Stack developer",address:{type:"Point",coordinates:[28.433894,77.334299]}})
3. создать GeoIndex для адресных полей
db.shops.createIndex({address: "2dsphere" } )
4. Теперь используйте агрегатор $geoNear, чтобы найти документы на расстоянии.
db.shops.aggregate([{$geoNear:{near:{type:"Point",coordinates:[28.411134,77.331801]},distanceField: "shopDistance",$maxDistance:150000,spherical: true}}]).pretty()
Здесь координаты:[28.411134,77.331801] — центральная позиция или требуемая позиция, откуда будут извлекаться документы.
distanceField:shopDistance , агрегатор $geoNear возвращает shopDistance в виде полей результата.
Результат:
{ "_id" : ObjectId("5ef047a4715e6ae00d0893ca"), "name" : "Full Stack developer", "address" : { "type" : "Point", "coordinates" : [ 28.433894, 77.334299 ] }, "shopDistance" : 621.2848190449148 }
{ "_id" : ObjectId("5ef0479e715e6ae00d0893c9"), "name" : "Mica store", "address" : { "type" : "Point", "coordinates" : [ 28.422894, 77.342299 ] }, "shopDistance" : 1203.3456146763526 }
{ "_id" : ObjectId("5ef0478a715e6ae00d0893c7"), "name" : "Galaxy store", "address" : { "type" : "Point", "coordinates" : [ 28.442894, 77.341299 ] }, "shopDistance" : 1310.9612119555288 }
{ "_id" : ObjectId("5ef04792715e6ae00d0893c8"), "name" : "A2Z store", "address" : { "type" : "Point", "coordinates" : [ 28.412894, 77.311299 ] }, "shopDistance" : 2282.6640175038788 }
Здесь shopDistance будет в метрах.
22.06.2020