2016-11-06 7 views
0

Я пытаюсь использовать geoNear для возврата документов в мою коллекцию, которые имеют координаты широты и долготы, но не получая никаких результатов, даже если в коллекции есть документы, которые имеют координаты широты и долготы. Я использую mlab для хранения моих данных, например, вот документ в моей коллекции.geoNear не возвращает результатов

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: «ближнее» поле должно быть точечным следующим:

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 вернуть документы широты и долготы коорд ? при изо Нужно ли хранить в базе данных широту и долготу определенным образом? Я попробовал db.command() также с geoNear, и я всегда получаю db.command, это не функция, то же самое с trucker.command или trucker.db.db.command или trucker.db.command (что угодно, с командой для получения данных из база данных, которая, по моему мнению, связана с тем, что я использую mongoose, а не mongoclient, потому что моя база данных настроена с помощью mlab). Ничего из того, что я пробовал, сработало, поэтому я сейчас задаю этот вопрос, поскольку я пробовал практически все, что можно было бы получить, чтобы получить результаты из моей базы данных с помощью geoNear.

+0

MongoDB геопространственных координаты должны быть сохранены как [долго, lat], похоже, что вы делаете [lat, long] - может быть источником проблемы? – pneumee

+0

Да, у меня не было этого формата [long, lat], но я попытался это сделать в какой-то момент и до сих пор не получал никаких результатов. Спасибо за ответ, хотя, потому что он заставил меня провести еще несколько тестов, а затем, после того, как geoNear вернет что-то! –

ответ

1

Я вернулся к нему этим утром и провел еще несколько тестов, потому что для меня не было смысла, почему у меня не было никаких результатов, поэтому я создал новую коллекцию, называемую местоположением, и вставил один документ для тестирования и он работал, а затем 2 документы, которые выглядят следующим образом и работал тоже:

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

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

по-видимому, место действительно должна быть в формате,

location: [longitude, latitude] 

или geoNear не сможет найти ваш документ.

Действительно интересная находка для меня, было то, что если у вас есть коллекция, с 10 документов, и есть документы, в вашей коллекции, которые не имеют:

location: [longitude, latitude] 

geoNear не получите никаких результатов либо , Если даже один документ не имеет этого поля, местоположение: [долгота, широта], geoNear также не сможет ничего найти или вернуть какие-либо результаты после проведения еще нескольких тестов.

Следующие работали для меня после создания этих двух новых документов в новой коллекции для тестирования с использованием мангуста и mlab.

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": "[email protected]", 
     "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": "[email protected]", 
     "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 не возвращает никаких результатов.

EDIT: сделав еще больше исследований, на самом деле это потому, что коллекция должна иметь геопространственный индекс, созданный с самого начала. Я попытался добавить поле местоположения ко всем документам коллекции, но не смог получить никаких результатов. Как только я удалил свою коллекцию целиком в mlab под названием «trucker» и снова добавил ее, я наконец смог найти этот индекс и получить результаты.

Эта линия необходима первоначально:

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

 Смежные вопросы

  • Нет связанных вопросов^_^