2016-11-06 19 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場所をピックアップし、その結果を返しますが、まだそれを見つけることができないだろうかどうかを確認しようとしていたので、私は、2つの異なる方法で座標を持っています。 8000/geoFind:今

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

、私のようなさまざまな方法を試してみましたローカルホストを訪れたとき、私は結果

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

私はこのような結果を得ていますを見つけるために、現在geoNearを使用していますどのようにこれがあります以下が、取得、レスポンス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); 
    } 
}); 

さて、私はどのように私は緯度と経度COORDで文書を返すようにgeoNearを使うのですか思ったんだけどinates?緯度と経度は特定の方法でデータベースに格納する必要がありますか?私はgeoNearとdb.command()を試してみました。私はいつもdb.commandを取得しました。これは、trucker.commandまたはtrucker.db.db.commandやtrucker.db.commandと同じです。私のデータベースはmlabで設定されているので、mongocloseではなくmongooseを使用しているためだと思うデータベースです)。私が試したことは何もありませんでした。なぜ私はgeoNearを使用してデータベースから結果を得るために想像できるあらゆる方法で試したので、今この質問をしています。

+0

MongoDBの地理空間座標は、長い[として保存する必要があります

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

その後、あなたは次のようなあなたの場所の近くのユーザーを見つけるためにgeoNearを使用することができますラット]、あなたが[ラット、ロング]をやっているように見える - 問題の原因になる可能性がありますか? – 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はあなたを見つけることができません資料。

location: [longitude, latitude] 

geoNearは、いずれかの任意の結果を得ることはありません。

私には本当に面白い発見は、あなたが10枚の文書で、コレクションを持っている、と持っていないあなたのコレクション内のドキュメントがある場合ということでした。 1つのドキュメントにもそのフィールドがない場合、location:[経度、緯度]、geoNearは何かを見つけたり、さらにテストをした後に結果を返すことはできません。

mongooseとmlabを使ってテスト目的でこれらの2つの新しいドキュメントを新しいコレクションに作成した後、以下のことができました。私はこの答えはgeoNearはどんな結果を返すされていない理由も不思議に思っているラインの下の他の誰かに役立ちます願ってい

{ 
    "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 
} 

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

と私は、次の結果を得ました。

EDIT:さらに多くの調査をした後、実際には収集にはget-goから作成された地理空間インデックスが必要であったためです。私はコレクションのすべてのドキュメントに場所フィールドを追加しようとしましたが、まだ結果が戻ってきませんでした。一旦、 "trucker"と呼ばれるmlabでコレクションを完全に削除して再追加すると、そのインデックスを検索して結果を得ることができました。

このラインが最初に必要とされている:

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); 
    } 
}); 
関連する問題