У меня есть ситуация, когда мне нужно рассчитать расстояние между пользователями. В этом конкретном сценарии у меня есть:Метеор рассчитывает расстояние между пользователями. Server side vs Client Side
Геолокация работодателя - одно пользовательское местоположение. Кандидат геолокации - одно место для каждого пользователя, но когда работодатель создает список кандидатов, есть несколько кандидатов.
В настоящее время я успешно выдвигаю геолокации по проводам и выполняю рудиментарную формулу расстояния на стороне клиента, чтобы выяснить расстояние между работодателем и каждым кандидатом «на лету», а затем показывать/скрывать кандидатов в соответствии с запросом ,
Мне сказали, что я должен выполнять расчеты на стороне сервера и просто нажимать на один номер, т.е. 10 - 10 км, для каждого кандидата. Затем запустите фильтр на этом номере.
До сих пор я только толкал коллекции и поля по проводам. Можно ли запустить приведенную ниже формулу на стороне сервера и просто передать одно число и «прикрепить» его к пользователю?
Второй вопрос: какая была бы лучшая практика для Метеор?
Я все еще участвую в коде, поэтому извиняюсь, если это действительно очевидный вопрос.
Client Side
Путь: List.js
specialisations = specialisations.filter(function(element){
let distance = Template.instance().distanceFromEmployerFilter.get();
let user = Meteor.users.findOne({_id: element.candidateUserId});
let candidateLat = user && user.profile && user.profile.address && user.profile.address.latitude;
let candidateLong = user && user.profile && user.profile.address && user.profile.address.longitude;
let company = CompanyDetails.findOne({employerUserId: Meteor.userId()});
let companyLat = company && company.latitude;
let companyLong = company && company.longitude;
var R = 6371; // Radius of the earth in km
var dLat = (companyLat-candidateLat) * (Math.PI/180);
var dLon = (companyLong-candidateLong) * (Math.PI/180);
var a =
Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos((candidateLat) * (Math.PI/180)) * Math.cos((companyLat) * (Math.PI/180)) *
Math.sin(dLon/2) * Math.sin(dLon/2)
;
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var distanceInKM = R * c; // Distance in km
if (distanceInKM <= distance) {
return true;
} else {
return false;
}
});
Если вы пытаетесь фильтровать и сортировать людей по расстоянию от точки, то вам лучше всего может быть геопространственной запрос MongoDB используя [$ вблизи] (https://docs.mongodb.com/v3.2/reference/operator/query/near/#op._S_near) * на сервере. * –