在mongoose模式中使用geoJSON并在查询中使用它

时间:2014-08-29 11:53:07

标签: node.js mongodb mongoose geojson

我是mongoDB的新手,并且在其中使用了geoJSON。

我使用mongoose模块创建了以下模式:

var mongoose    = require('mongoose');

var hikeSchema = mongoose.Schema({

  name: String,
  area: String,
  length: Number,
  time: String,
  Difficulty: { type : Number, min : 0 , max :5 },
  start_coord: {
    lon: Number,
    lat: Number
  },
  rank_count: Number,
  avg_overall_rating: { type : Number, min : 0 , max :5 },
  completed_count: Number,
  description: String,
  ranking_pages: [
    mongoose.Schema.Types.ObjectId
  ]

});

module.exports = mongoose.model('Hike', hikeSchema);

我使用简单的Number类型来表示模式中子对象内的经度和纬度。

我不知道这是否可以解决这个问题。我希望将其保存为geoJSON对象,然后对该对象运行查询。

2 个答案:

答案 0 :(得分:3)

我建议您查看地理位置数据的mongoDB部分:http://docs.mongodb.org/manual/core/2d/

要存储经度,纬度,MongoDB会带您使用正确的数据结构来保存项目:

  

要将位置数据存储为旧坐标对,请使用数组或嵌入文档。   如果可能,请使用数组格式:

     
    

loc:[<经度> ,<纬度> ]

  
     

考虑嵌入式文档表单:

     
    

loc:{lng :, lat:}

  
     

首选数组,因为某些语言不保证关联地图排序。

     

对于所有点,如果您使用经度和纬度,请以经度,纬度顺序存储坐标。

在你的shema上,改变

start_coord: {
  lon: Number,
  lat: Number
},

通过:

start_coord: {
  lng: Number,
  lat: Number
},

然后你应该为你的字段start_coords添加一个2dindex来使用所有mongoDB地理空间查询:

db.collection.ensureIndex( { start_coord : "2d" } , { min : <l ower bound > , max : < upper bound > } )

编辑如果您的经度和纬度不是真正的lng / lat(例如,如果您可以在正交映射中使用2个指数),设置最小值和最大值非常重要

现在您可以使用所有地理空间查询运算符:http://docs.mongodb.org/manual/reference/operator/query-geospatial/

答案 1 :(得分:2)

你也可以这样做:

start_coord: {
    type: [Number],   // [<longitude>, <latitude>]
    index: '2d'   // create the geospatial index
}

查看本教程:How to use geospatial indexing in mongoDb