mongoose로 지리 정보 처리 (aggregate().near())

14668 단어 mongoosegeojsonMongoDB

전제


  • MongoDB Server가 로컬에서 실행되고 있다고 가정
  • 동작 확인 환경
  • Windows10, VSCode
  • Node v8.11.3
  • "mongodb": "3.1.6",
  • "mongoose": "5.3.1",

  • 참고
  • 제9회 MongoDB의 지리 공간 인덱스
  • [MongooseAPI] Aggregate.prototype.near()
  • [MongoDB]$geoNear (aggregation)


  • 개요



    여러 가지가 있지만 Aggregate의 $ geoNear를 사용하면 거리도 얻을 수있어 좋은 느낌
    Mongoose에서는 near이므로 주의. 왜 geoNear가 아닌지 알 수 없습니다.

    샘플 소스



    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()
    

    실행 결과



    에비스, 신주쿠, 고탄다가 돌아온다.
    거리는 거리에 미터로 보존된다.


    이상.

    좋은 웹페이지 즐겨찾기