【问题标题】:geoNear not returning any resultsgeoNear 不返回任何结果
【发布时间】:2017-03-19 22:28:59
【问题描述】:

我正在尝试使用 geoNear 返回我的集合中具有纬度和经度坐标的文档,但即使集合中有具有纬度和经度坐标的文档也没有得到任何结果。我正在使用 mlab 来存储我的数据,例如,这是我收藏中的一个文档。

var trucker = db.collection('trucker');

{
    "_id": {
        "$oid": "581e82d00f192a694bb56679"
    },
    "latitude": 77.0551642746301,
    "longitude": 10.825842664395019,
    "loc": [
        77.0551642746301,
        10.825842664395019
    ],
}

我以两种不同的方式获得坐标,因为我试图查看 geoNear 是否会获取该位置并返回结果,但仍然找不到。这就是我目前使用 geoNear 来查找结果的方式

exports.geoNear = function (lat, lon ,res, next)
{
    console.log("Inside geoNear");
    var job = {};
    job.lon = JSON.parse(lon);
    job.lat = JSON.parse(lat);
    console.log(job.lon);
    console.log(job.lat);

    trucker.geoNear([job.lon, job.lat], function(err, success){
        if(success) {
            res(success);
        } else {
            console.log('Response error' + err);
        }
    });
};

app.get('/geoFind', function(req, res) {
    AM.geoNear('48.99759239999999', '-123.0683089', function(o){
        res.send(200,o);        
    });
});

我在访问 localhost:8000/geoFind: 时得到这个结果:

{
  "waitedMS": 0,
  "results": [],
  "stats": {
    "nscanned": 0,
    "objectsLoaded": 0,
    "maxDistance": 0,
    "time": 0
  },
  "ok": 1
}

现在,我尝试了许多不同的方法,例如以下但得到,Response errorMongoError: 'near' field must be point with the following:

trucker.createIndex( { loc : "2dsphere" } )

trucker.geoNear({loc: {type: "Point", coordinates: [job.lon,job.lat]}}, {spherical: true}, function(err, success) {
    if(success){
        res(success);
    } else {
        console.log('Response error '+err + job.lon +':' + job.lat);
    }
});

现在,我想知道如何使用 geoNear 返回具有纬度和经度坐标的文档?经纬度是否需要以特定方式存储在数据库中?我也用 geoNear 尝试了 db.command() 并且我总是得到 db.command 不是一个函数,与 trucker.command 或 trucker.db.db.command 或 trucker.db.command 相同(任何有命令从中获取数据的东西我认为的数据库是因为我使用的是 mongoose 而不是 mongoclient,因为我的数据库是用 mlab 设置的)。我尝试过的任何方法都没有奏效,这就是为什么我现在问这个问题的原因,因为我已经尝试了几乎所有可以想象的方式来使用 geoNear 从我的数据库中获取结果。

【问题讨论】:

  • MongoDB 地理空间坐标需要存储为 [long, lat],看起来你正在做 [lat, long] - 可能是问题的根源?
  • 是的,我没有它 [long, lat] 格式,但我确实尝试过这个,但仍然没有得到任何结果。不过感谢您的回答,因为它让我进行了更多测试,然后让 geoNear 终于返回了一些东西!

标签: node.js mongodb mongoose mlab


【解决方案1】:

我今天早上回来做了一些测试,因为我不明白为什么我没有得到任何结果,所以我创建了一个名为 location 的全新集合,并插入了 1 个文档进行测试工作,然后是 2 个文件,如下所示并且也工作:

{
    "_id": {
        "$oid": "581cc2f430c34502e36eb148"
    },
    "truckerID": "b233a9eaaedc63730e71a8b542606ee82e0aa5e5",
    "name": "Justin",
    "email": "Justin@gmail.com",
    "company": "Justins Shipping",
    "user": "justin1",
    "pass": "D6Mvu6rUur758f37eac7010958c14557bb4df9871a",
    "phone": "1234567890",
    "location": [
        -73.9928,
        40.7193
    ]
}

{
    "_id": {
        "$oid": "581cc2f530c34502e36eb158"
    },
    "truckerID": "b233a9eaaedc63731e72a8b542606ee82e0aa7a6",
    "name": "Alan",
    "email": "Alan@gmail.com",
    "company": "Alans Shipping",
    "user": "alan1",
    "pass": "D6Mvu6fUur758f37eac7010958c14557bb4df9872c",
    "phone": "1234567890",
    "location": [
        -122.4194155,
        37.7749295
    ]
}

显然,位置确实必须采用格式,

location: [longitude, latitude] 

或 geoNear 将无法找到您的文档。

对我来说真正有趣的发现是,如果您有一个包含 10 个文档的集合,而您的集合中有一些文档没有:

location: [longitude, latitude] 

geoNear 也不会得到任何结果。如果即使一个文档没有该字段,location: [longitude, latitude],geoNear 也将无法找到任何内容,或者在进行更多测试后返回任何结果。

在使用 mongoose 和 mlab 在新集合中创建这 2 个新文档以用于测试目的之后,以下内容对我有用。

exports.geoNear = function (lon, lat ,res, next)
{
    console.log("Inside geoNear");
    var job = {};
    job.lon = JSON.parse(lon);
    job.lat = JSON.parse(lat);
    console.log(job.lon);
    console.log(job.lat);

    locations.geoNear([job.lon, job.lat], {spherical: true}, function(err, success){
        if(success) {
            res(success);
        } else {
            console.log('Response error' + err);
        }
    });

}

var AM = require('./modules/account-manager');

app.get('/geoFind', function(req, res) {
    AM.geoNear('-73.99279', '40.719296', function(o){
        res.send(200,o);        
    });
});

我得到了以下结果:

{
  "waitedMS": 0,
  "results": [
    {
      "dis": 1.4957325341976439e-7,
      "obj": {
        "_id": "581cc2f430c34502e36eb148",
        "truckerID": "b233a9eaaedc63730e71a8b542606ee82e0aa5e5",
        "name": "Justin",
        "email": "Justin@gmail.com",
        "company": "Justins Shipping",
        "user": "justin1",
        "pass": "D6Mvu6rUur758f37eac7010958c14557bb4df9871a",
        "phone": "1234567890",
        "location": [
          -73.9928,
          40.7193
        ]
      }
    },
    {
      "dis": 0.6482546796756842,
      "obj": {
        "_id": "581cc2f530c34502e36eb158",
        "truckerID": "b233a9eaaedc63731e72a8b542606ee82e0aa7a6",
        "name": "Alan",
        "email": "Alan@gmail.com",
        "company": "Alans Shipping",
        "user": "alan1",
        "pass": "D6Mvu6fUur758f37eac7010958c14557bb4df9872c",
        "phone": "1234567890",
        "location": [
          -122.4194155,
          37.7749295
        ]
      }
    }
  ],
  "stats": {
    "nscanned": 24,
    "objectsLoaded": 2,
    "avgDistance": 0.3241274146244688,
    "maxDistance": 0.6482546796756842,
    "time": 6
  },
  "ok": 1
}

我希望这个答案能帮助那些也想知道为什么 geoNear 没有返回任何结果的人。

编辑:在做了更多研究之后,实际上是因为集合需要从一开始就创建一个地理空间索引。我尝试将位置字段添加到集合中的所有文档,但仍然无法获得任何结果。一旦我在名为“卡车司机”的 mlab 中完全删除了我的集合并重新添加它,我终于能够搜索该索引并获得结果。

最初需要这一行:

trucker.createIndex( { location : "2dsphere" } )

然后您可以使用 geoNear 查找您所在位置附近的用户,例如:

trucker.geoNear([job.lon, job.lat], {maxDistance:5000, distanceMultiplier: 6378137, spherical: true}, function(err, success){
    if(success) {
        res(success);
    } else {
        console.log('Response error' + err);
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2017-12-09
    • 2020-10-03
    • 2017-05-20
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多