2

私のmongodbコレクションには。という名前のソースフィールドと宛先フィールドがありますFlight。両方のフィールドは地理空間的にインデックスが付けられ、緯度経度形式で書き込まれます。私はmongomapperを使用してRailsコントローラーからクエリを実行しています。

次のようなクエリを書きたいです。

Result= Flight.where(:source => {'$near' =>  location_src} , :destination => {'$near' => location_dest} )

ここで、location_srcとlocation_destは、緯度経度形式のGUI入力です。

ただし、Result.firstまたはResult.allを 記述して結果にアクセスしようとすると、と表示されますMongo::OperationFailure: can't have 2 special fields

誰かが私に回避策を提案できますか?

よろしく、アムリッシュ。

4

4 に答える 4

2

私の目的に役立ち、同様のシナリオに直面している人に役立つ可能性のある簡単な回避策を見つけました。

mongodbは、複数のフィールドで同時に地理空間クエリをサポートしていませんが、複数のフィールドで同時に地理空間インデックスを作成することはできます。したがって、次のように、両方のフィールドに対して次々にクエリを実行します。

  • start_place:開始場所の名前
  • start_place_loc:開始位置の座標(インデックス付き地理空間フィールド)
  • end_place:宛先の場所の名前
  • end_place_loc:宛先の場所の座標(インデックス付きの地理空間フィールド)

以下はサンプルコードです。

tmp=Flight.distinct(:start_place,:start_place_loc => {'$near' =>  location_src} )

Result=Flight.where(:start_place_loc => {'$near' =>  location_src} , :start_place => {'$in' => tmp})

また、要件に応じて'$ maxDistance'=>"value"を設定する必要があります。

于 2012-09-20T12:54:15.050 に答える
1

現在、Mongodbはコレクションごとに1つのジオインデックスのみをサポートしています。それはこのページから文書化されています

現在のところ、コレクションごとに1つの地理空間インデックスしかありません。MongoDBでは複数のインデックスを作成できる場合がありますが、この動作はサポートされていません。MongoDBは単一のクエリをサポートするために1つのインデックスしか使用できないため、ほとんどの場合、複数のgeoインデックスがあると望ましくない動作が発生します。

于 2012-09-20T10:54:50.387 に答える
0

@Amrish

currently mongodb can have only one 2d index per collection, However you can have Multi-location Documents.

Address : [ {loc:[Lon,Lat], // or {lon: "somevalue" , lat:"somevalue"} name:"start" },

{loc:[Lon,Lat], // or {lon: "somevalue" , lat:"somevalue"} name:"end" }, ]

And you can have 2d index on Address.loc

This can be helpful with $near and geoNear in searching and can be used for workaround to search Find all "start" point near to given lat-lng pair

Also note : it should be (long,lat) pair Not reverse.

]

于 2012-11-04T14:58:44.120 に答える
0

SOは例をジグザグにしているように見えます

すぐに、name:startまたはname:endの(lng、lat)ペアを配置します。上記のペアの配列を作成して、上記の配列に2dインデックスを配置します。

これは、指定された(lng、lat)ペアに近いすべての開始点をクエリで見つけるのに役立ちます。これは、指定された(lng、lat)ペアに近いすべてのエンドポイントをクエリで見つけるのに役立ちます。

そして、あなたは上記の2つの操作のためにAND/ORなどの操作を使用できるはずです

于 2012-11-04T15:02:31.927 に答える