Geonear 不工作 - mongodb?

Posted

技术标签:

【中文标题】Geonear 不工作 - mongodb?【英文标题】:Geonear is not working - mongodb? 【发布时间】:2015-11-18 17:44:39 【问题描述】:

我在集合 offers 中有以下示例 mongodb 文档。

收藏:优惠

 
   "countryCode" : "LU",
   "geoLocation" : [ 
         
            "lat" : 49.8914114000000026,
            "lng" : 6.0950994999999999
         
    ]
 ,
 
   "countryCode" : "DE",
   "geoLocation" : [ 
         
            "lat" : 50.8218536999999984,
            "lng" : 9.0202151000000015
         
    ]
 

要求:

根据大约50公里半径的地理位置获取文档

我尝试过的:

db.getCollection('offers').aggregate([
    
        $geoNear: 
            near: [6.0950994999999999, 49.8914114000000026],
            distanceField: "geoLocation",
            maxDistance: 50000, //50 km radius
        
    
]);

问题:

它正在获取所有文档而不是搜索大约 50 公里。

任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

旧版坐标对不以米为单位返回距离,而是以弧度为单位。因此,您的 maxDistance 远大于 50 公里。见Calculate Distances with Spherical Geometry

但也要考虑这里使用的实际距离:

db.getCollection('offers').aggregate([
    
        $geoNear: 
            near: [6.0950994999999999, 49.8914114000000026],
            distanceField: "distance"
    
]);

返回:


    "_id" : ObjectId("55dc0f4b6f07ad5d3ec3b6d0"),
    "countryCode" : "DE",
    "geoLocation" : [
            
                    "lat" : 50.8218537,
                    "lng" : 9.020215100000001
            
    ],
    "distance" : 60.588259822017925


    "_id" : ObjectId("55dc0f4b6f07ad5d3ec3b6cf"),
    "countryCode" : "LU",
    "geoLocation" : [
            
                    "lat" : 49.8914114,
                    "lng" : 6.0950995
            
    ],
    "distance" : 61.93733827090219

因为“distanceField”是报告与查询点的投影距离的字段。

因此,起点是您的文档对于地理空间查询无效。像这样修复它们:

首先删除所有索引:

db.offers.dropIndexes();

然后修复字段:

var bulk = db.offers.initializeOrderedBulkOp(),
    count = 0;

db.offers.find().forEach(function(doc)  
  //printjson(doc);

  var tmp = 
    "type": "Point",
    "coordinates": [doc.geoLocation[0].lng,doc.geoLocation[0].lat]
  ;
  doc.geoLocation = tmp;
  printjson(doc);

  bulk.find( "_id": doc._id ).updateOne(
    "$set":  "geoLocation": doc.geoLocation 
  );
  count++;

  if ( count % 1000 == 0 ) 
    bulk.execute();
    bulk = db.offers.initializeOrderedBulkOp();
  
);

现在数据以正确的 GeoJSON 格式表示:


    "_id" : ObjectId("55dc14856f07ad5d3ec3b6d1"),
    "countryCode" : "LU",
    "geoLocation" : 
            "type" : "Point",
            "coordinates" : [
                    6.0950995,
                    49.8914114
            ]
    


    "_id" : ObjectId("55dc14856f07ad5d3ec3b6d2"),
    "countryCode" : "DE",
    "geoLocation" : 
            "type" : "Point",
            "coordinates" : [
                    9.020215100000001,
                    50.8218537
            ]
    

现在创建一个索引为 2dsphere:

db.offers.createIndex( "geoLocation": "2dsphere" )

现在您可以查询了:

db.offers.aggregate([
     "$geoNear": 
      "near": 
        "type": "Point",
        "coordinates": [6.0950994999999999, 49.8914114000000026]
      ,
      "distanceField": "distance",
      "spherical": true,
      "maxDistance": 50000
    
])

返回“近”的一个文档,或者实际上是 0 距离:


    "_id" : ObjectId("55dc14856f07ad5d3ec3b6d1"),
    "countryCode" : "LU",
    "geoLocation" : 
            "type" : "Point",
            "coordinates" : [
                    6.0950995,
                    49.8914114
            ]
    ,
    "distance" : 0

【讨论】:

感谢您提供信息,但上述查询未返回任何结果集 @karthick.k 请参阅以上信息。您还错误地使用了$geoNear 谢谢,但以下查询不适用于 maxDistance,db.getCollection('offers').aggregate([ $geoNear: near: [6.0950994999999999, 49.8914114000000026], distanceField: "distance",最大距离:50 / 6378.1 ]); @karthick.k 这里有很多问题,而不仅仅是一个。现在的答案是解决所有问题的完整指南。 仅供参考,这个答案也适用于嵌套结构。谢谢布雷克斯。

以上是关于Geonear 不工作 - mongodb?的主要内容,如果未能解决你的问题,请参考以下文章

GraphQL和MongoDB` $ geoNear`聚合

MongoDB $geoNear 聚合管道(使用查询选项和使用 $match 管道操作)给出不同的结果

java mongodb“geoNear”命令返回异常错误17304

mongodb geoNear 使用记录

通过 geoNear 获取子文档 - MongoDB

Mongodb geoNear 和组聚合