2016-12-12 3 views
0

У меня есть ситуация, когда мне нужно рассчитать расстояние между пользователями. В этом конкретном сценарии у меня есть:Метеор рассчитывает расстояние между пользователями. 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; 
    } 

}); 
+1

Если вы пытаетесь фильтровать и сортировать людей по расстоянию от точки, то вам лучше всего может быть геопространственной запрос MongoDB используя [$ вблизи] (https://docs.mongodb.com/v3.2/reference/operator/query/near/#op._S_near) * на сервере. * –

ответ

1

Я хотел бы сделать фильтрацию на выборки кандидатов для отображения. Либо, как вы опубликовать/подписаться на ваш шаблон или вы запрашиваете в вашем помощнике:

Meteor.users.find({ 
    "profile.address" : { 
    $near: { 
    $geometry: { 
     type: "Point" , 
     coordinates: [ <Employerlongitude> , <Employerlatitude> ] 
    }, 
    $maxDistance: <distance in meters>, 
    $minDistance: <distance in meters> 
    }}}).fetch(); 

Если адрес является 2d индекс. Укажите координаты в следующем порядке: «долгота, широта.»

из MongoDB документы:

$ вблизи Задает точку, для которой геопространственной запрос возвращает документов от ближайшего к самому дальнему. Оператор $ near может указывать либо точку GeoJSON, либо устаревшую координатную точку.

$ minDistance & $ maxDistance являются необязательными