我是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对象,然后对该对象运行查询。
答案 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
}