Найти объекты близлежащих мест с помощью mongodb |все близлежащее местоположение A ко всем близлежащему местоположению B - PullRequest
0 голосов
/ 17 июня 2019

enter image description here

Привет, специалисты MongoDB

Я пытаюсь получить некоторые результаты запроса, используя различные функции определения местоположения MongoDB ($ near, $ geoNear и другие).

У меня есть модель мангуста с типом geoJSON.

const geoSchema = new Schema({
   type: {
     type: String,
     default: 'Point',
   },
   coordinates: {
     type: [Number],
   },
});

const pickupSchema = new Schema({
  geo_location_from: geoSchema,
  geo_location_to: geoSchema,
});

pickupSchema.index({ geo_location_from: '2dsphere' });
pickupSchema.index({ geo_location_to: '2dsphere' });

То, чего я пытаюсь достичь, это рядом с местом проведения мероприятия.

У меня есть главное событие захвата от А до В, и, как показано на рисунке, у меня есть Широта и Долгота всего местоположения. Теперь я пытаюсь запросить все эти объекты событий из базы данных, где событие geo_location_from находится рядом с местоположением A (пример: A1, A2, A3), а geo_location_to находится рядом с местоположением B (B1, B2).

Вот что я сделал, что не правильно. Я не уверен на 100%.

Pickup.find(
    {
      $and: [{
        geo_location_from: {
          $near: {
            $maxDistance: 1000,
            $geometry: {
              type: 'Point',
              coordinates: [args.longitude_from, args.latitude_from],
            },
          },
        },
      }, {
        geo_location_to: {
          $near: {
            $maxDistance: 1000,
            $geometry: {
              type: 'Point',
              coordinates: [args.longitude_to, args.latitude_to],
            },
          },
        },
      }],
    },
  )

Некоторые из моих попыток заканчивались тем, что давали различные виды ошибок. как Слишком много выражений geoNear и многие другие.

У кого-нибудь есть хорошее решение этой проблемы?

1 Ответ

1 голос
/ 17 июня 2019

Так что я думал о том, как сделать все, что вы просите, но я думаю, что это очень трудно (если не невозможно) сделать это только с MongoDb.Идеальным решением было бы ИМХО использовать turf.js вместе с MongoDb.
Я пришел к подходу, который, я думаю, мог бы быть тем, что вы ищете.

Чтобы получить все места, которые одновременно находятся рядом с обеими точками пространства, нам нужно определить многоугольник (область), где искать эти места.Учитывая, что в большинстве случаев у вас есть только 2 точки, многоугольник должен быть похож на круг.

Невозможно сделать это с GeoJson, поэтому приходит turf.js .может сделать что-то вроде:

// create the points
let point1 =  turf.point([-90.548630, 14.616599]);
let point2 = turf.point([-88.548630, 14.616599])

// we get the midpoint that we'll use as the center of our circle
const midPoint = turf.midpoint(point1, point2) 

// we create a polygon that we'll use as our area
const options = {steps: 100, units: 'kilometers'}; // options for the circle
const circle = turf.circle(midPoint, options)

// a possible place near both locations
let point3 = turf.point([-91.43897, 14.56784])

// then you can get if a point is inside the circle or not
const inside = turf.booleanWithin(point3, circle) 

Это просто идея.Вы можете настроить радиус своего круга, чтобы получить дальше или ближе места.Затем вы можете, конечно, упорядочить места, которые вы нашли внутри круга, по близости к центру (это можно легко сделать в MongoDb).

Я предлагаю вам внимательно изучить документы turf.js и MongoDb , чтобы иметь более четкое представление о том, как заставить их работать вместе без проблем (и, возможно,найти лучшее, более простое решение, чем мое).

...