MongoDB $接近查询准确性问题

时间:2018-04-26 21:03:22

标签: mongodb geospatial

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

  1. 我选择了2个相距不到5公里的坐标:

    • 61.4644750214197,23.8426943813556
    • 61.497133399999996,23.778528100000003
  2. (至少根据thisthisthis等工具,这些坐标之间的距离应约为4,99公里。

    1. 我将其中一个坐标添加到空“items”集合中:
    2. db.items.insert({
          "geo" : {
              "type" : "Point",
              "coordinates" : [ 
                  61.4644750214197, 
                  23.8426943813556
              ]
          }
      });
      
      1. 我在集合中添加了“2dsphere”索引,使地理空间查询成为可能:
      2. db.items.createIndex( { geo : "2dsphere" } )
        
        1. 最后,我使用$ near查询的其他坐标:
        2. 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. 我希望结果为1但是它为0.即使我将$ maxDistance设置为7000,结果仍为0,但如果我将其设置为8000,结果将为1.
          2. 我做错了什么或MongoDB地理空间查询(或只是$ near查询?)不准确?如果是这样,有没有更好的方法来获得这种查询的准确结果?这是我第一次在MongoDB中处理地理空间查询,所以对我的问题可能有一个微不足道的解释。

            修改 基本上我梦想的功能是在距离用户当前位置X公里内显示地图中的所有项目,并且X可以由用户确定。如果即使用户想要在7公里范围内过滤物品,也不会看到5公里范围内的物品,这将是很不方便的。

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

            $ 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
               }
            )
            

1 个答案:

答案 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:

希望有帮助