mongoose로 지리 정보 처리 (aggregate().near())
전제
개요
여러 가지가 있지만 Aggregate의 $ geoNear를 사용하면 거리도 얻을 수있어 좋은 느낌
Mongoose에서는 near이므로 주의. 왜 geoNear가 아닌지 알 수 없습니다.
샘플 소스
mongoose 연결 정보, 생략
Mongoose Model Place
../models/placeconst mongoose = require('mongoose')
const Schema = mongoose.Schema;
const geoSchema = new Schema({
type : { type : String , default : 'Point'},
coordinates : { type : [Number] , default : [0,0] }
});
const placeSchema = new Schema({
place_id : { type : String, required : [false, 'Place id is required'], default:'new' },
place_name : { type : String, default:'new place' },
location : { type : geoSchema , index: '2dsphere', default: geoSchema },
lastupdate : { type : Date, default: Date.now},
});
const Place = mongoose.model('Place', placeSchema);
module.exports = {Place}
실행 파일require('../config/config.js')
const { mongoose } = require("../db/mongoose");
const { Place } = require("../models/place");
//サンプルデータ定義
// http://gihyo.jp/dev/serial/01/mongodb/0009
const places=[
{ place_id : '1', place_name : '五反田', location:{ type:'Point', coordinates:[ 139.723822, 35.625974 ]}},
{ place_id : '2', place_name : '恵比寿', location:{ type:'Point', coordinates:[ 139.710070, 35.646685 ]}},
{ place_id : '3', place_name : '新宿', location:{ type:'Point', coordinates:[ 139.700464, 35.689729 ]}},
{ place_id : '4', place_name : '新大久保',location:{ type:'Point', coordinates:[ 139.700261, 35.700875 ]}},
{ place_id : '5', place_name : '池袋', location:{ type:'Point', coordinates:[ 139.711086, 35.730256 ]}},
{ place_id : '6', place_name : '上野', location:{ type:'Point', coordinates:[ 139.777043, 35.713790 ]}},
{ place_id : '7', place_name : '品川', location:{ type:'Point', coordinates:[ 139.738999, 35.628760 ]}}
]
// テーブル初期化
async function populatePlaces() {
await Place.deleteMany({});
await Place.insertMany(places);
}
//近い順にPlaceデータ取得 GeoNear(aggregate)
//https://mongoosejs.com/docs/api.html#aggregate_Aggregate-near
async function geonear(limit){
const results = await Place.aggregate()
.near({
near: { type : "Point", coordinates: [139.701238, 35.658871] }, //渋谷駅
spherical: true,
distanceField: "distance", //メートル
})
.limit(limit)
console.log(results)
}
//メイン関数
async function main(){
await populatePlaces() //コレクション初期化
await geonear(3) //近い方から3つ表示
}
main()
실행 결과
에비스, 신주쿠, 고탄다가 돌아온다.
거리는 거리에 미터로 보존된다.
이상.
Reference
이 문제에 관하여(mongoose로 지리 정보 처리 (aggregate().near())), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ta1nakamura/items/2a767c7217d989fd1390
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
mongoose 연결 정보, 생략
Mongoose Model Place
../models/place
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const geoSchema = new Schema({
type : { type : String , default : 'Point'},
coordinates : { type : [Number] , default : [0,0] }
});
const placeSchema = new Schema({
place_id : { type : String, required : [false, 'Place id is required'], default:'new' },
place_name : { type : String, default:'new place' },
location : { type : geoSchema , index: '2dsphere', default: geoSchema },
lastupdate : { type : Date, default: Date.now},
});
const Place = mongoose.model('Place', placeSchema);
module.exports = {Place}
실행 파일
require('../config/config.js')
const { mongoose } = require("../db/mongoose");
const { Place } = require("../models/place");
//サンプルデータ定義
// http://gihyo.jp/dev/serial/01/mongodb/0009
const places=[
{ place_id : '1', place_name : '五反田', location:{ type:'Point', coordinates:[ 139.723822, 35.625974 ]}},
{ place_id : '2', place_name : '恵比寿', location:{ type:'Point', coordinates:[ 139.710070, 35.646685 ]}},
{ place_id : '3', place_name : '新宿', location:{ type:'Point', coordinates:[ 139.700464, 35.689729 ]}},
{ place_id : '4', place_name : '新大久保',location:{ type:'Point', coordinates:[ 139.700261, 35.700875 ]}},
{ place_id : '5', place_name : '池袋', location:{ type:'Point', coordinates:[ 139.711086, 35.730256 ]}},
{ place_id : '6', place_name : '上野', location:{ type:'Point', coordinates:[ 139.777043, 35.713790 ]}},
{ place_id : '7', place_name : '品川', location:{ type:'Point', coordinates:[ 139.738999, 35.628760 ]}}
]
// テーブル初期化
async function populatePlaces() {
await Place.deleteMany({});
await Place.insertMany(places);
}
//近い順にPlaceデータ取得 GeoNear(aggregate)
//https://mongoosejs.com/docs/api.html#aggregate_Aggregate-near
async function geonear(limit){
const results = await Place.aggregate()
.near({
near: { type : "Point", coordinates: [139.701238, 35.658871] }, //渋谷駅
spherical: true,
distanceField: "distance", //メートル
})
.limit(limit)
console.log(results)
}
//メイン関数
async function main(){
await populatePlaces() //コレクション初期化
await geonear(3) //近い方から3つ表示
}
main()
실행 결과
에비스, 신주쿠, 고탄다가 돌아온다.
거리는 거리에 미터로 보존된다.
이상.
Reference
이 문제에 관하여(mongoose로 지리 정보 처리 (aggregate().near())), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/ta1nakamura/items/2a767c7217d989fd1390
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(mongoose로 지리 정보 처리 (aggregate().near())), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ta1nakamura/items/2a767c7217d989fd1390텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)