2012-04-04 13 views
3

私はcsvファイルからインポートされた非常に大きなデータベース(6百万行まで)を持っています。 GeoSpatialのインデックス作成に関するMongoDBとそのドキュメントを調べていました。配列に埋め込まれた緯度と経度のフィールドが必要です。残念ながら、私がインポートした構造には、フィールドが別々です。MongoDB GeoSpatial埋め込み緯度経度フィールドのないクエリ

「緯度」:54.770233、 「経度」:-6.537741、

54と経度の緯度点を用いて、25マイルの半径内の20件の最も近いドキュメントを計算するためにDBを照会する任意の可能な方法はあります-6。

私はMySQLの罰金にクエリを作成:

SELECT *、(3959 * ACOS(COS(RADIANS(54))* COS(RADIANS(latitude))* COS(RADIANS(longitude) - RADIANS( - 6))+ SIN(RADIANS(54))* SIN(RADIANS(latitude))))距離 LIMIT 0、20

BY距離 ORDERしかし、私はわからない午前HAVING TABLE_NAME からの距離 AS埋め込みフィールドなしでMongoでこれを行う方法。

ご協力いただければ幸いです。

答えて

3

私はあなたができるとは思わない。スクリプトを実行してすべての文書を更新しますが、時間はかかりますが長すぎません。その後、通常どおり2dインデックスを作成することができます。を更新しました

> db.test.insert({latitude:73,longitude:-47}); 
> db.test.insert({latitude:20,longitude:-30}); 
> db.test.find().forEach(function(doc) { 
    doc.loc = [doc.longitude, doc.latitude]; 
    db.test.save(doc); 
}); 
> db.test.find(); 
{ "_id" : ObjectId("4f7c63f117cd93783bba936d"), "latitude" : 73, "longitude" : -47, "loc" : [ 73, -47 ] } 
{ "_id" : ObjectId("4f7c63f817cd93783bba936e"), "latitude" : 20, "longitude" : -30, "loc" : [ 20, -30 ] } 

実は、私はあなたがWHERE句でそれを行うことができたとし、それがどのインデックスを使用することはありません。しかし、それが1つの質問のためであれば、それはおそらく大丈夫でしょう。

db.test.find("(3959 * Math.acos(Math.cos(54 * 0.0174532925) * Math.cos(this.latitude * 0.0174532925) * Math.cos(this.longitude * 0.0174532925) - (-6 * 0.0174532925)) + Math.sin(54 * 0.0174532925) * Math.sin(this.latitude * 0.0174532925)) > 25 "); 

これは実際には機能しません。計算結果が大きすぎます。私はあなたの数学をコピーしようとしていただけですが、何かが正しくないはずです。いずれにせよ、距離によるソートも同様に問題になるだろう。私は、最初の解決策は少し使いやすいと思う。

+0

すべてのドキュメントを更新するために実行する正しいスクリプトは何でしょうか? – user1313125

+0

私のサンプルコードでは 'find()。forEach(' ... ...)の部分です –

+0

ありがとう、私は現在スクリプトを実行していますが、残念ながらかなり時間がかかるようです。別のデータベースでテストした後。 – user1313125