地理空間検索
地理空間クエリをサポートするために、MongoDB は 地理空間インデックス と 地理空間クエリ演算子 を提供します。
地理空間クエリの実行の詳細については、サーバー マニュアルの地理空間クエリを参照してください。
前提条件
このガイドのコード例を実行するには、次のコンポーネントを設定する必要があります。
A
test.restaurants
コレクション populated with documents from therestaurants.json
ファイル in the documentation assets Github.次のインポート ステートメントは次のとおりです。
import com.mongodb.reactivestreams.client.MongoClients; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoCollection; import com.mongodb.reactivestreams.client.MongoDatabase; import com.mongodb.client.model.geojson.*; import com.mongodb.client.model.Indexes; import com.mongodb.client.model.Filters; import org.bson.Document;
重要
このガイドでは、カスタムSubscriber
実装を使用します。これについては、 カスタム サブスクリプション実装ガイドで説明されています。
MongoDB 配置への接続
まず、MongoDB 配置に接続し、 インスタンスとMongoDatabase
MongoCollection
インスタンスを 宣言して定義します。
次のコードは、ポート27017
のlocalhost
で実行されているスタンドアロンの MongoDB 配置に接続します。 次に、 test
データベースを参照するためのdatabase
変数と、 restaurants
コレクションを参照するためのcollection
変数を定義します。
MongoClient mongoClient = MongoClients.create(); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection<Document> collection = database.getCollection("restaurants");
MongoDB 配置への接続の詳細については、「 MongoDB への接続」チュートリアルを参照してください。
2 dsphere インデックスの作成
2dsphere
インデックスを作成するには、 Indexes.geo2dsphere()
ヘルパーを使用して2dsphere
インデックスの仕様を作成します。 仕様をMongoCollection.createIndex()
メソッドに渡してインデックスを作成します。
次の例では、 restaurants
コレクションの"contact.location"
フィールドに2dsphere
インデックスを作成します。
MongoCollection<Document> collection = database.getCollection("restaurants"); collection.createIndex(Indexes.geo2dsphere("contact.location")) .subscribe(new PrintSubscriber<String>());
GeoJSON ポイント近くのロケーションのクエリ
MongoDB はさまざまな地理空間クエリ演算子を提供します。 地理空間クエリフィルターの作成を容易にするために、ドライバーはFilters
クラスとcom.mongodb.client.model.geojson
パッケージを提供します。
次の例では、指定された GeoJSON Point
インスタンスから少なくとも1000メートル、最大5000メートル離れたドキュメントを、近いものから遠いものの順に返します。
Point refPoint = new Point(new Position(-73.9667, 40.78)); collection.find(Filters.near("contact.location", refPoint, 5000.0, 1000.0)) .subscribe(new PrintDocumentSubscriber());