2017-03-21 5 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' 객체의 객체를 반복 할 때 내 모델 메소드가 작동하지 않습니다. 더 깊이 파고들 필요가 있습니다. –