gpt4 book ai didi

node.js - MongoDB:将 $near 运算符与 $maxDistance 一起使用时,点不在区间内

转载 作者:可可西里 更新时间:2023-11-01 10:04:22 26 4
gpt4 key购买 nike

当我尝试从 Mongo shell 中查找距犹他州盐湖城 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'}
}
});

数据库中的成员对象如下所示:

{
"_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 位置数组实际上是 [longitude, latitude]。

最佳答案

一些事情。首先,我认为您的查询已关闭 - 您正在查询坐标:[ 111.000 , 40.000 ] 它应该是坐标:[ -111.000 , 40.000 ]

其次,您提供的示例数据点 [ -111.8833, 40.7500 ] 距离您更正的查询点超过 50 公里,实际上约为 122 公里(在此处测试:http://andrew.hedges.name/experiments/haversine/ )

因此,如果我像您存储的那样将数据存储在 mongodb 中,那么纠正这两个问题我可以执行以下操作:

1) 创建正确的索引:

db.members.ensureIndex({ "geo.point": "2dsphere"})

2) 运行这个查询:

db.members.find({ 'geo.point':
{$地理范围内:
{$centerSphere: [[ -111.000 , 40.000 ], 113/6371]}
}
} )

请注意,我将 113 km/6371 除以弧度,这是此特定查询所需的弧度。

自己试试吧。一般来说,如果您可以在未来使用 GeoJSON 存储内容,但使用您现有的架构和上述索引和查询,我能够获得正确的结果,那么您会过得更好。

关于node.js - MongoDB:将 $near 运算符与 $maxDistance 一起使用时,点不在区间内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901238/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com