MongoDB:在$ maxDistance中使用$ near操作符时不会出现间隔
当我试图从蒙戈壳find犹他州盐湖城50公里范围内的所有成员时,我得到的错误是:
error: { "$err" : "point not in interval of [ -180, 180 ] :: caused by :: { 0: 0.0, 1: 50000.0 }", "code" : 16433 }
这是我正在运行的查询:
db.members.find( { 'geo.point' : { $near : { $geometry : { type : "Point" , coordinates : [ 111.000 , 40.000 ] }, $maxDistance : 50000 } } } )
成员模式是这样的:
var memberSchema = mongoose.Schema({ name: { first: {type:String, default:''}, last: {type:String, default:''}, }, geo: { latitude: {type:String, default:''}, longitude: {type:String, default:''}, country: {type:String, default:''}, state: {type:String, default:''}, place: {type:String, default:''}, zip: {type:String, default:''}, point: {type: [Number], index: '2d'} } });
DB中的成员对象如下所示:
{ "_id" : ObjectId("xxxxxxxxxxxxxxxxxxx"), "name": { "first": "Thom", "last": "Allen" }, "geo" : { "point" : [ -111.8833, 40.7500 ], "zip" : "84115", "state" : "UT", "country" : "US", "longitude" : "-111.8833", "latitude" : "40.7500" } }
是否有可能我的领域没有以正确的格式存储? 如果我将50000更改为低于180的任何值,它将会起作用,但这不是按照文档中的方式运行的:
http://docs.mongodb.org/manual/reference/operator/query/near/
**只是一个头,正确的mongo位置数组实际上是[经度,纬度]。
一些东西。 首先,我想你的查询是closures的 – 你正在查询坐标: [ 111.000 , 40.000 ]
,它应该是坐标: [ -111.000 , 40.000 ]
其次,您提供的示例数据点[ -111.8833, 40.7500 ]
距离您修正的查询点超过50公里,实际上大约为122公里(在此处testing: http : //andrew.hedges.name/experiments/haversine/ )
所以,如果我将数据存储在mongodb中(如存储它),则可以更正这两个问题,我可以执行以下操作:
1)创build正确的索引:
db.members.ensureIndex({ "geo.point": "2dsphere" })
2)运行这个查询:
db.members.find({ 'geo.point': {$geoWithin: {$centerSphere: [[ -111.000 , 40.000 ], 113/6371]} } } )
请注意,我已经划分了113公里/ 6371这给你弧度这是这个具体的查询所需要的。
亲自尝试一下。 一般来说,如果您将来可以使用GeoJSON存储事物,但使用现有的模式和上述索引和查询,则可以获得正确的结果。
数据中包含的是传统坐标对的格式,但您正在尝试使用GeoJSON语法进行查询。
遗留坐标对唯一有效的索引forms是“2d”索引,所以如果你创build了一个“二维球体”索引是行不通的。 所以你需要删除任何“二维球体”索引,并创build一个“2D”索引如下:
db.members.ensureIndex({ "geo.point": "2d" })
如果您实际上打算使用GeoJSON表单和“2dsphere”索引types,那么您需要数据来支持它,例如:
{ "loc" : { "type" : "Point", "coordinates" : [ 3, 6 ] } }
所以它需要“types”和“坐标”的底层结构才能使用这种索引types和查询forms。