感谢先前的计算,我有一个先前查询过的城镇中心的坐标:[lon, lat]
。我在查询radius
中有另一个参数。我想在这个虚拟的cercle中找到我的数据库中的每个文件。
我的架构:
const artisanSchema = new Schema ({
created: { type: Date, default: Date.now },
updated: { type: Date, default: Date.now },
name: { type: String, index: true },
address: {
street: String,
zip: { type: String, index: true },
town: { type: String, index: true }
},
contact: {
tel: String,
mail: String,
web: String
},
activities: [String],
type: String,
geometry: mongoose.Schema.Types.Point, //"geometry": {"coordinates":[0.704378,45.194518],"type": "Point"
}
tagMetier: [Number]
});
我尝试这样的查询:
Artisan.
find ({
'tagMetier': tag,
'geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad ] } }
},
function (err, artisan) {
if (err) throw err;
else {
res.send(artisan);
}
})
.limit(10)
如果我的目标是我自己的半径为5公里的城镇,那么我可以从我居住的地方获得200公里以上的城镇答案。
答案 0 :(得分:0)
首先创建索引
您可以确保moongose schema level
上的索引或直接Mongodb
收藏
这样的Mongo DB
db.Artisan.createIndex( { geometry : "2dsphere" } )
或在moongse Scehema Level
geometry: mongoose.Schema.Types.Point, index: "2dsphere"
现在查询
Artisan.find({ location:
{ $geoWithin:
{ $centerSphere: [ [ myTown.longitude, myTown.latitude ], 5 / 3963.2 ] } } ,'tagMetier': tag})
假设你的半径是弧度
以下将在5英里内找到所有工匠
或
您可以使用$maxDistance
作为meter
var METERS_PER_MILE = 1609.34
Artisan.find({ location: { $nearSphere: { $geometry: { type: "Point", coordinates: [ myTown.longitude, myTown.latitude ] }, $maxDistance: rad * METERS_PER_MILE } } })
有关详细信息,请查看此信息 https://docs.mongodb.com/manual/tutorial/geospatial-tutorial/
答案 1 :(得分:0)
rad
不是像公里那样的度量单位,而是以弧度为单位,因为地球是一个不完美的椭球体(所以我们通过将它计算为一个大球来简化)。
如果我想要以公里为单位的结果,我必须这样做:rad/6378.1
英里:rad/3963.2
最后我写道:geometry': { $geoWithin: { $centerSphere: [ [ myTown.longitude, myTown.latitude ], rad/6378.1 ] } }
瞧。