Правильный запрос Mongodb эквивалент SQL-запроса - PullRequest
1 голос
/ 21 июня 2019

Как правильно сделать этот точный sql-запрос в Mongodb + Nodejs?

select *,
    acos(cos(centerLat * (PI()/180)) *
     cos(centerLon * (PI()/180)) *
     cos(lat * (PI()/180)) *
     cos(lon * (PI()/180))
     +
     cos(centerLat * (PI()/180)) *
     sin(centerLon * (PI()/180)) *
     cos(lat * (PI()/180)) *
     sin(lon * (PI()/180))
     +
     sin(centerLat * (PI()/180)) *
     sin(lat * (PI()/180))
    ) * 3959 as Dist
from TABLE_NAME
having Dist < radius
order by Dist

Код, полученный из этого ответа: https://stackoverflow.com/a/12235184/8025329

Это моя схема Мангуста:

const spotSchema = new Schema({
    latitude: { type: String, required: true },
    longitude: { type: String, required: true },
    spotDate: { type: Date, required: true }
});

Я ожидаю получить записи, показывающие точки на карте рядом с местоположением пользователя.Эта часть, я думаю, не соответствует формуле + SQL-запрос.Моя проблема в том, как перевести это на Mongodb + NodeJs.

Спасибо всем.

1 Ответ

0 голосов
/ 23 июня 2019

Хорошо, мне удалось сделать это следующим образом:

Я получил ценные указания из этого ответа: https://stackoverflow.com/a/23291154/8025329

Наконец это заставило его работать (это не окончательно и не отполировано, но решает основныевызов), я выкладываю самые важные части:

подключение к Mongoose (пространственное упоминание 'useCreateIndex: true'):

mongoose.connect(config.MONGO_URI, { useNewUrlParser: true, useCreateIndex: true });

Mongooseсхема:

const Schema = new Schema({
    loc: { type: Object, index: '2dsphere', required: true },
    category: { type: String, required: true }
});

Пример объекта GeoJson:

{
loc : { type: "Point", coordinates: [ longitude, latitude ] },
        category : "location"
      }

Поиск ближайших мест:

MongodbSchema.aggregate([
      {
        $geoNear: {
           near: { type: "Point", coordinates: [ longitude , latitude ] },
           key: "loc",
           distanceField: "dist.calculated",
           maxDistance: 600,
           query: { category: "location" },
           num: 100,
           spherical: true
        }
      }
   ], function(err, locations){
    if (err) throw err;

    res.send(locations);

   });

Полезные ссылки: https://docs.mongodb.com/manual/reference/operator/aggregation/geoNear/#pipe._S_geoNear

https://docs.mongodb.com/manual/reference/geojson/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...