在我的应用程序中,我想查询附近(例如在5公里内)到坐标的项目,我试图使用$near来实现这一点 . 快速浏览一下,我认为它有效,但在我进一步测试之后,似乎查询有点不准确 . 这是我的设置:

  • 我选择了两个相距不到5公里的坐标:

  • 61.4644750214197,23.8426943813556

  • 61.497133399999996,23.778528100000003

(至少根据像thisthisthis这样的工具,这些坐标之间的距离应约为4,99km)

  • 我将其中一个坐标添加到空"items"集合中:
db.items.insert({
    "geo" : {
        "type" : "Point",
        "coordinates" : [ 
            61.4644750214197, 
            23.8426943813556
        ]
    }
});
  • 我在集合中添加了"2dsphere"索引,使地理空间查询成为可能:
db.items.createIndex( { geo : "2dsphere" } )
  • 最后,我在$ near查询中使用了另一个坐标:
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()
  • 我希望结果为1但是它为0.即使我将$ maxDistance设置为7000,结果仍为0,但如果我将其设置为8000,结果将为1 .

我做错了什么或MongoDB地理空间查询(或只是$ near查询?)不准确?如果是这样,有没有更好的方法来获得这种查询的准确结果?这是我第一次在MongoDB中处理地理空间查询,所以对我的问题可能有一个微不足道的解释 .

EDIT: 基本上我梦想的功能是在用户当前位置X公里范围内显示 Map 中的所有项目,X可以由用户确定 . 如果即使用户想要在7km内过滤物品,也不会看到5km内的物品,这将是不方便的 .

我已经尝试了大多数执行此查询的选项,例如$centerSphere$nearSpheregeoNear,结果类似 . 他们似乎都声称我之前提到的坐标之间的距离介于7-8公里之间 . 我错过了关于距离如何工作的一些关键的和平信息,或者2.根本不可能用mongodb来解决我的问题 . 以下是我对其他选项的查询:

$centerSphere (0 results with 5, 6 and 7km but 1 result with 8km):

db.items.find( { geo: { 
        $geoWithin: { $centerSphere: [ [ 61.497133399999996, 23.778528100000003 ], 5/6378.1 ] 
    }
}}).count()

geoNear (0 results with maxDistance 5000, 6000 and 7000 but 1 result with 8000):

db.runCommand(
   {
     geoNear: "items",
     near: { type: "Point", coordinates: [ 61.497133399999996, 23.778528100000003 ] },
     spherical: true,
     maxDistance: 5000
   }
)