जब आप sequelize.fn . को घेर लेते हैं कोष्ठक के साथ, आपको एक उपनाम के रूप में एक स्ट्रिंग भी शामिल करनी होगी:
[sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location), 'ALIASNAME']
साथ ही, ST_Distance
को बदलने का प्रयास करें से ST_Distance_Sphere
. तक . तो:
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);
})
यह वास्तव में मेरे लिए काम कर रहा है। obs:सुनिश्चित करें कि आप 'उपयोगकर्ता' को उस मॉडल से प्रतिस्थापित करते हैं जिसमें आपके पास ज्यामिति डेटा प्रकार है।
अपडेट करें: यदि आप अभी भी order: 'distance'
. का उपयोग करके आदेश नहीं दे सकते हैं , हो सकता है कि आपको इसे एक var में घोषित करना चाहिए और order: distance
. का उपयोग करना चाहिए बिना उद्धरण के, इस तरह:
var lat = parseFloat(json.lat);
var lng = parseFloat(json.lng);
var attributes = Object.keys(User.attributes);
var location = sequelize.literal(`ST_GeomFromText('POINT(${lng} ${lat})')`);
var distance = sequelize.fn('ST_Distance_Sphere', sequelize.literal('geolocation'), location);
attributes.push([distance,'distance']);
var query = {
attributes: attributes,
order: distance,
include: {model: Address, as: 'address'},
where: sequelize.where(distance, {$lte: maxDistance}),
logging: console.log
}
दूरी सटीकता पर अपडेट:
सरिकाया . द्वारा उल्लिखित समाधान अधिक सटीक प्रतीत होता है। पोस्टग्रेज़ का उपयोग करके इसे करने का तरीका यहां दिया गया है:
var distance = sequelize.literal("6371 * acos(cos(radians("+lat+")) * cos(radians(ST_X(location))) * cos(radians("+lng+") - radians(ST_Y(location))) + sin(radians("+lat+")) * sin(radians(ST_X(location))))");