Как я могу найти таблицу базы данных с широтой и долготой, используя секвелизировать - PullRequest
0 голосов
/ 08 января 2020

У меня есть таблица магазинов, в которой есть столбец lat_long, в котором хранится широта / долгота каждого магазина как геометрическая точка в сиквелизе. Я хочу искать магазины на основе близости широты / долготы от тела запроса от внешнего интерфейса. Я пытался использовать много смежных тем (ответ), касающихся этого, в Stackoverflow, но выяснилось, что запрос можно записать так:

const location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})', 4326)`);

    User.findAll({
      attributes: [[sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location),'distance']],
      order: 'distance',
      limit: 10,
      logging: console.log
    })
    .then(function(instance){
      console.log(instance);
    })

Пробовал, и он работает нормально, но проблема в том, который; в этом примере и почти во всех примерах, которые я видел, они использовали атрибут, который возвращает только расстояние, но я хочу вернуть все поля в таблице. Затем я попытался удалить атрибут, тогда полученный ответ не был найден на основе геометрии (расстояния), и я также попытался использовать где, но получаю ошибку.

Ниже показан мой последний запрос, который возвращает ошибку пожалуйста, как я могу go об этом? спасибо.

export const getNearestStoreWithCategory = async (lat, long) => {
  try {
    const location = sequelize.literal(`ST_GeomFromText('POINT(${lat} ${long})')`);
    const distance = sequelize.fn('ST_Distance_Sphere', sequelize.literal('lat_long'), location)
    const storeArr = await Store.findAll({
      order: distance,
      where: sequelize.where(distance),
      limit: 20
    })
    return storeArr
  } catch (error) {
    return error
  }
}

1 Ответ

0 голосов
/ 08 января 2020

Из do c в https://sequelize.org/v4/manual/tutorial/querying.html, я предполагаю, что вам не хватает в образце кода, который вы имели, включая расстояние до полей, которые будут возвращены как ответ от БД скорее только вычисление расстояния и возврата;

const location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})', 4326)`);

User.findAll({
    attributes: {
        include: [[sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location),'distance']]
    },
    order: 'distance',
    limit: 10,
    logging: console.log
})
    .then(function(instance){
        console.log(instance);
    })

Это должно дать запрос типа; SELECT id, OTHER_FIELDS_OF_THIS_TABLE, ST_Distance_Sphere(geolocation) AS distance ...

Теперь это непроверенный код, но вы можете попробовать и прокомментировать, поможет он или нет.

...