0

MongoDB に複雑な geojson ドキュメントが保存されています。私の目標は、私の条件に当てはまるオブジェクトを取得することです。

フィールドに「avenue」を含むオブジェクトを取得したいと考えています'features.properties.name'。私はこれを試しました:db.LineString.find({'features.properties.name' : "Avenue"})結果:

ここに画像の説明を入力

ご覧のとおり、これによりドキュメント全体が返されます。object 0私の目標は、特定の条件を満たす強調表示されたようなオブジェクトを返すことです。また、何らかの方法で結果を視覚化することはできますか?

4

2 に答える 2

0

多くの調査の結果、特定のオブジェクトを実際にクエリし、RoboMongo とGoogle ドラッグ アンド ドロップ GeoJSONを使用してそれらを視覚化する方法を見つけました。

クエリ部分については、ここで指定されている以下の手法を使用できます。

//[Thematic]  Finds all the LineString documents that contain “Avenue” in their name.
db.LineString.aggregate(
 { $match : {
     "features.properties.name": /avenue/i
  }},
  { $unwind : "$features" },
  { $match : {
     "features.properties.name": /avenue/i
  }}
)

ここでは、取得するフィールドを定義するために$unwind集約ステージを使用します。その後、特定の条件でドキュメントを取得するために$matchを使用します。最初の一致では、インデックス (テキスト、空間など) を利用して、時間を大幅に短縮できることに注意してください。MongoDB でドキュメントを右クリックすると、生成された JSON を表示して保存できます。

ただし、空間データを操作する場合、特に複雑な構造を操作する場合は、マップにデータを配置したいと思うでしょう。そのためには、データをJSON から GeoJSONに変換する必要があります。以下に、ファイルを変換するために使用した正規表現を示します。

アルゴリズム JSON ファイル (MongoDB から生成) から GeoJSON へ:

  1. 消去: "features" : \{.* AND "coordinates"[^}]*\K\} AND "type" : "Feature" AND "ok" : 1.0000000000000000 AND "id".*, **AND** "_id" : ObjectId(.*`
  2. 置換: "type" : "FeatureCollection",[^}]*\}WITH "type" : "Feature", AND "result" : [ WITH "features" : [ { "type": "FeatureCollection", "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, "features" : [

Notepad++ を使用してこれらの正規表現を実行します。

  1. "features" : \{.*|"coordinates"[^}]*\K\}|"type" : "Feature"|"ok" : 1.0000000000000000|"id".*,|"_id" : ObjectId\(.*,
  2. "type" : "FeatureCollection",[^}]*\}, と置換する "type" : "Feature",

免責事項: データを投影する方法は明らかに出力ファイルに影響するため、ファイルは異なる構造に従う場合があることに注意してください。このような場合は、追加の修正が必要です。

GeoJSON ファイルができたので、それをGoogle の GeoJSON APIにドラッグ アンド ドロップできます。上記のクエリは、名前に「Avenue」を含むバンクーバーの道路を取得します。

ここに画像の説明を入力

考え: 生成された JSON は、劣った変更を加えて GeoJSON に変換できるため、この作業は RoboMongo から直接実行できると思います。また、このREGEXは複雑すぎることに注意してください。より安定したソリューションに興味がある場合は、 NodeJSJacksonなどの JSON ライブラリを使用して、新しいファイルを生成することをお勧めします。私の場合は完璧です。

楽しみ :)

于 2015-10-25T23:12:02.047 に答える
0
find(arg1)

使用するコマンドは、コレクションに保存されたドキュメントを返すため、ネストされたドキュメントを検索できますが、最上位のコレクション ドキュメントの一部を返すことはできません。すべてのドキュメントを返します。

ドキュメント構造が通常の場合、これを使用してみてください

find(arg1, arg2)

代わりに、返されるフィールドを制限するhttps://docs.mongodb.org/manual/tutorial/project-fields-from-query-results/

ドキュメントの構造が不規則な場合は、お気に入りのプログラミング言語でスクリプトを作成してください

于 2015-10-22T16:39:48.840 に答える