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。