GET 메소드를 재대로 만들어 보겠습니다.
url로 요청하면 실제로 요청한 리스트를 가져다 주는 내용을 알아보겠습니다.
mongoose를 이용해가지고 몽고DB에서 한게의 다큐먼트를 찾아봅시다.
mongoose는 모델인스턴스를 가지고 db와 이야기 합니다.
모델은 먼저만들어야 합니다!
이것을 이용해서 다큐먼트를 찾는 것은 findByid입니다.
모델을 통해서 지원되는 매소드가 있습니다.
findeOne - 첫 번째 다큐먼트를 가져옵니다.
모델에다가 findById 메소드 적용하는 법
id 파라미터를 넣습니다.
Loc라는 모델 인스턴스가 있습니다.
파라미터에 실제 id를 넣어줍니다.
바로 명령이 실행되는 것은 아닙니다.
쿼리만 지정한 것 입니다.
쿼리를 실행하려면 exec 메소드를 실행해야 합니다.
exec 매소드를 써봅시다
콜백 함수로 비동기식으로 이루어 집니다.
findById 메소드를 사용해 봅시다.
하나의 location을 찾는 컨트롤러가 locationsReadOne 이였습니다.
Express에서 params라는 객체가 있습니다.
여기에 파라미터들을 가져다 둡니다.
패던에 맞는 파라미터을 요청객체에 가져다 둡니다.
라우팅에 정의된 locationid가
params객체 안에 있는 것입니다.
req(요청객체)
params(객체)
lcoationid(요청된id)
이렇게 쓸 수 있습니다.
정리를 해보겠습니다.
실제 실행은 exec() 메서드를 콜백함수로 실행하게 합니다.
성공적으로 수행하면 location에 db에서 가져온 지역 1개가 담겨질 것입니다.
json으로 요청자에게 돌려줍니다.
mongoose의 버전을 확인해야 합니다.
npm install mongoose를 해봅시다.
항상 성공할 수 만은 없습니다!
에러를 할 수 있어야 좋은 api 입니다.
하나의 서브 다큐먼트를 찾아봅시다
먼저 부모 다큐먼트를 찾고 그 밑에 있는 서브 다큐먼트를 찾는 방식입니다.
정확하게 내가 필요한 것만 받을 수 있도록 제한할 수 있습니다.
select 메소드만 있따면 불필요한 내용은 없이 뽑아 낼 숭 ㅣㅆ습니다.
locationid가 부모 디렉토리 입니다.
select의 파라미터로 name과 reviews만 넣는다는 것은
name과 review만 얻고 싶다는 것입니다.
공백으로 구분합니다
id매소드로 서브 다큐먼트 배열에서 특정 id를 갖는 것을 가져올 수있습니다.
location은 배열객체일 것입니다.
서브 다큐먼트인 review를 가지고
부모 다큐먼트의 review배열을 가지고 와서
특별한 id인 reviewid를 가지고 반환 해달라는 것입니다.
임의로 데이터 하나를 넣어봅시다
db.locations.update를 사용해서 리뷰를 넣어봅시다.
Geospatial query에 대해 알아봅시다.
장소를 검색해서 나열해줄 수 있습니다.
geospatial aggregation 란 매소드가 있습니다.
geoNear는 어떤 지점을 중심으로 가까운 장소 리스트를 찾아줍니다.
geoNear를 알아봅시다.
3가지 옵션이 있습니다.
1.near - 지점을 경위도 좌표로 나타냅니다.
2. distanceField - 지점으로 부터 거리입니다.
3. maxDistance - 지점에서최대 거리 입니다.
geoNear를 더 자세히 알아봅시다
Near의 타입은 Point입니다.
배열로 경위도를 가집니다.
파라미터를 설정해주는 것이 없습니다.
url에서 ? 뒤에 붙히면 파라미터를 지정할 수 있습니다.
이게 쿼리 스트링이라고 합니다.
lng와 lat라는 파라미터로 지정해 줍시다.
여러개가 있을 때는 & 표시로 구분해 줍니다.
코드에서 lng와 lat를 가져와야 합니다.
현제 위치에서 주변에 가까이 있는 장소들을 만들어야 합니다.
request의 query의 lng값, lat값을 가져옵시다.
옵션들을 위에서 만듭니다.
$geoNear라는 매서드에 옵션으로 나와야 합니다.
...은 Spread operator입니다.
배열을 가져와가지고 풀어서 인자로 만들어 줍니다.
spherical key를 의미합니다.
db검색을 할 때 spherical 객체를 기반으로 할지 flat plane을 기반으로할지
(지구처럼 둥근 것으로 계산할지, 평평한 것으로 계산할 지)
20000으로 된것은 20km 입니다.
메서드가 성공적으로 수행되면
범위 안에 든 장소들을 다 찾아서 배열로서 반환합니다.
각 객체를 보면 distanceField에 distance값(near에 지정된 값과 그곳의 차이)
다큐먼트(객체) 자체를 반환해줍니다.
거리값을 데이터 자체에 포함시켜서 반환할 수 있습니다.
geoNear메소드가 성공적으로 반환되면 이렇게 나옵니다.
distance값을 포함시켜가지고 기존에 있떤 다큐먼트와 합쳐서 반환합니다.
distance의 단위는 사람이 보기에 소숫점 자리수가 너무 많습니다.
그래서 보기 좋게 바꿀 필요가 있습니다.
near를 기준으로 반경에 있는 lcoation들이 너무 많을 수 있습니다.
반환되는 데이터를 필요한 만큼만 제한을 시킬 필요가 있습니다.
전처리를 한다음 응답으로 보냅시다.
api에서는 올바르게 보내고 있는지 확인할 필요가 있습니다.
result를 전처리하고 보내봅시다.
locations를 만들고
map 매소드를 써서 전처리를 합니다.
새로운 변수인 locations라는 배열을 만듭니다.
항상 성공하는 것은 아닙니다.
에러 부분에서도 트래핑을 해줘야 할 필요가 있습니다.
파라미터가 제대로 도착했는지
geoNear가 에러를 반환 했는지
최종 컨트롤러 입니다.
이런 에러가 뜹니다.
위에 corrdinates를 오타내서 query형식을 재대로 하라는 오류였습니다.
띄어 쓰기를 제대로 해야합니다.
'웹 > school(MEAN)' 카테고리의 다른 글
Consuming a REST API [1]:Using an API from insideExpress (0) | 2021.10.19 |
---|---|
Writing a REST API [3]:Exposing the MongoDBdatabase to the application (0) | 2021.10.13 |
Building a data model withMongoDB and Mongoose [1] (0) | 2021.09.29 |
Building a static sitewith Node and Express [2] (0) | 2021.09.28 |
Building a static sitewith Node and Express [1] (0) | 2021.09.15 |