2016-12-12 13 views
0

ユーザー間の距離を計算する必要がある状況があります。この特定のシナリオで私は持っています:ユーザ間の距離を計算するメテオ。サーバー側とクライアント側

雇用者の地位 - 1つのユーザーの1つの場所。 候補ジオロケーション - ユーザーごとに1つの場所がありますが、雇用主が候補リストを生成するときに複数の候補があります。

私は現在、ジオロケーションをワイヤー上に押し込んでクライアント側で基本距離公式を実行しているので、雇用者と各候補者の間の距離を把握し、要求に応じて候補者を表示/非表示にしています。

私は、サーバー側で計算を実行して、ただ1つの数値、すなわち、各候補につき10kmを表す10。その後、その番号でフィルタを実行します。

これまでのところ、私はコレクションとフィールドだけをワイヤーにプッシュしました。下の数式をサーバー側で実行し、1つの数値を渡してユーザーに「添付」することは可能ですか?

第2の質問は、メテオのベストプラクティスは何ですか?

私はまだコードを学習しているので、これが本当に明白な質問であれば謝ります。

クライアント側

パス: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

オプションである[$近く](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ポイントまたは従来の座標ポイントのいずれかに指定できます。あなたは、あなたの最善の策は、使用して地理空間MongoDBのクエリであるかもしれないフィルタリングし、点からの距離で人を分類しようとしている場合

$ minDistance & $ maxDistanceが

関連する問題