2017-03-21 19 views
0

Location」フィールドを持つモデルイベントがあります。場所のリストに「距離」を挿入する方法

私たちが達成したいのは、緯度/経度座標に近いクエリを指定すると、リストの各結果に、distanceというフィールドがあります。これは、指定された座標からlocation.geo結果セット内の各オブジェクト

KeystoneJSロケーションタイプ定義には、underscore methods for thisがあります。

しかし、これをリスト内の各結果の「仮想」として注入する方法を理解することはできません。

要求されたLat/Lonをアンダースコアメソッドに渡して結果リストに挿入する方法については、誰も知りませんか?

var q = Event.paginate({ page: req.query.page || 1, perPage: req.query.max || 20 }) 
         .where('eventDate').gt(since) 
         .where('state').equals('published') 
         .sort("eventDate") 

if (req.query.lon && req.query.lat) { 
    var coords = [req.query.lon, req.query.lat]; 
    var maxD = (req.query.maxDistance || 5)/6371; 
    q = q.where('location.geo') 
      .near({ center: coords, maxDistance: maxD, spherical:true }) 
} 
q.exec(function(err, items) { 
    if (err) return res.apiError('database error', err); 
    res.apiResponse({ 
     events: items 
    }); 
}); 

答えて

1

KeystoneJSアイテムは、ドキュメントの機能として動作するメソッドを持つことができます。仮想関数はパラメータを受け付けません(ドキュメントのプロパティに基づいて値を計算/返すために使用されます)。だからここでスキーマのメソッドが必要です。

Event.jsモデルコードでは、現在のドキュメントに格納されている座標に基づいて距離(キロメートル)を計算する適切な方法を作成する必要があります。

Event.schema.methods.distanceKM = function (latitude, longitude, cb) { 
    return cb(this._.location.kmFrom([longitude, latitude])); 
}; 

これは非同期の実装です。このようにしたくない場合は、代わりにこれを使用してください。

Event.schema.methods.distanceKM = function (latitude, longitude) { 
    return this._.location.kmFrom([longitude, latitude]); 
}; 

あなたはマイルにあるように、結果のために必要がある場合は、ちょうど方法でmilesFromkmFromを変更します。

これで、各イベントの距離関数を呼び出すことができます。その実装はあなた次第ですが、以下のクエリで返されるアイテムはすべてdistance関数になり、そのイベントからパラメータ化された座標までの距離(kmまたはマイル)が返されます。

重要

私はkmFrommilesFromのための現在の実装が壊れていることをこれを書いている最中に発見されました。 npmの最新リリースでは、この壊れたコードがあります。 The functions have been updated on GitHub(ローカルで変更するための少量のコードを見ることができます)、書き込み時にキーストーンのリリースにプッシュされていません。

+0

非常にお手伝いをしていただきありがとうございます。私は問題の一部が '.paginate'関数であると考えています。これは、リストアイテムをModelオブジェクトとして返さないので、' items.results'のオブジェクトを繰り返し処理すると、私のモデルメソッドが機能していません。これ以上深く掘り下げる必要があります。 –

関連する問題