Node.js 如何使用sequelize搜索具有纬度和经度的数据库表
我有一个存储表,它有一个列lat_long,将每个存储纬度/经度存储为sequelize中的几何点。我想根据从前端到请求正文的纬度/经度的接近度来搜索商店。我曾尝试在Stackoverflow中利用许多与此相关的主题(答案),但我学到的是,查询可以这样编写Node.js 如何使用sequelize搜索具有纬度和经度的数据库表,node.js,geolocation,sequelize.js,Node.js,Geolocation,Sequelize.js,我有一个存储表,它有一个列lat_long,将每个存储纬度/经度存储为sequelize中的几何点。我想根据从前端到请求正文的纬度/经度的接近度来搜索商店。我曾尝试在Stackoverflow中利用许多与此相关的主题(答案),但我学到的是,查询可以这样编写 const location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})', 4326)`); User.findAll({ attributes
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);
})
我已经试过了,效果很好,但我面临的挑战是;在这个例子中,我看到的几乎所有示例都使用了属性,该属性只返回距离,但我想返回表中的所有字段。然后我尝试删除属性,然后我得到的响应没有根据几何体(距离)进行搜索,我还尝试使用where,但得到了一个错误
下面显示的是我的最新查询,返回错误。请告诉我如何处理此问题?多谢各位
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
}
}
从上的文档中,我猜您在示例代码中缺少的是作为db响应返回的字段的距离,而不是仅计算距离并返回
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);
})
这应该给出一个类似的查询;
选择id、此表的其他字段、ST\u Distance\u Sphere(地理位置)作为距离…
现在,这是一个未经测试的代码,但如果它有用或不有用,您可以尝试一下并发表评论。请告诉我,我仍然需要一个答案或一种替代方法,谢谢@Orelongz它真的有用。它返回的正是我想要的。谢谢你,我非常高兴,感谢并尊重你的知识。