在我的应用程序中,我想查询附近的项目(例如在5公里内)到坐标,我尝试使用$near来实现这一点。快速浏览一下,我认为它有效,但在我进一步测试之后,似乎查询有点不准确。这是我的设置:
我选择了2个相距不到5公里的坐标:
(至少根据this,this或this等工具,这些坐标之间的距离应约为4,99公里。
db.items.insert({
"geo" : {
"type" : "Point",
"coordinates" : [
61.4644750214197,
23.8426943813556
]
}
});
db.items.createIndex( { geo : "2dsphere" } )
db.items.find({geo: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ 61.497133399999996, 23.778528100000003 ]
},
$maxDistance: 5000 // according to docs with '2dsphere' index and GeoJSON this is is meters
}
}}).count()
我做错了什么或MongoDB地理空间查询(或只是$ near查询?)不准确?如果是这样,有没有更好的方法来获得这种查询的准确结果?这是我第一次在MongoDB中处理地理空间查询,所以对我的问题可能有一个微不足道的解释。
修改 基本上我梦想的功能是在距离用户当前位置X公里内显示地图中的所有项目,并且X可以由用户确定。如果即使用户想要在7公里范围内过滤物品,也不会看到5公里范围内的物品,这将是很不方便的。
我尝试了大多数执行此查询的选项,例如$centerSphere,$nearSphere和geoNear,但结果相似。他们似乎都声称我之前提到的坐标之间的距离介于7-8公里之间。我开始认为1.我错过了一些关于距离如何工作的关键信息,或者2.我根本不可能用mongodb来解决我的问题。以下是我对其他选项的查询:
$ centerSphere(0,6和7km的结果,但8km的结果为1):
db.items.find( { geo: {
$geoWithin: { $centerSphere: [ [ 61.497133399999996, 23.778528100000003 ], 5/6378.1 ]
}
}}).count()
geoNear(0结果为maxDistance 5000,6000和7000,但结果为8000):
db.runCommand(
{
geoNear: "items",
near: { type: "Point", coordinates: [ 61.497133399999996, 23.778528100000003 ] },
spherical: true,
maxDistance: 5000
}
)
答案 0 :(得分:0)
我知道我参加晚会很晚,但是对于所有面临类似问题的人
这里的问题是,当您将数据存储到“坐标”中时,它必须按照 [经度,纬度] 的顺序,因为这是mongodb的工作方式。 https://docs.mongodb.com/manual/geospatial-queries/#spherical我以相反的坐标顺序运行了您的示例,该示例按预期运行。
db.items.insert({
"geo" : {
"type" : "Point",
"coordinates" : [
23.8426943813556,
61.4644750214197
]
}
});
然后我跑了
db.items.find({geo: {
$near: {
$geometry: {
type: "Point" ,
coordinates: [ 23.778528100000003 , 61.497133399999996]
},
$maxDistance: 5000
}
}}).count()
这里的计数是1:
希望有帮助