web-dev-qa-db-ja.com

MongoDB '$ geoNearクエリのインデックスが見つかりません'

単純なnearクエリを機能させようとしています。これが私のドキュメントのサンプルです。

{"point": 
  {"type": "Point", 
     "coordinates": [30.443902444762696, -84.27326978424058]}, 
   "created_on": {"$date": 1398016710168}, 
   "radius": 180, 
   "user": {"$oid": "53543188eebc5c0cc416b77c"}, 
   "_id": {"$oid": "53544306eebc5c0ecac6cfba"}, 
   "expires_on": {"$date": 1399831110168}
}

そしてmongodで私はコマンドを試しました:

db.bar.find({point: {$near: [-84.26060492426588, 30.45023887165371]}});

しかし、私はこのエラーを受け取ります:

エラー:{"$ err": "クエリを実行できません:クエリの処理中にエラーが発生しました:ns = foo.bar skip = 0\nTree:GEONEAR field = point maxdist = 1.79769e + 308 isNearSphere = 0 || First:notFirst:full path :ポイント\ nソート:{}\nProj:{}\nプランナーはエラーを返しました:$ geoNearクエリのインデックスが見つかりません "、" code ":17007}

たぶん、今日のグーグルフーはそれほどシャープではないかもしれませんが、何も見つかりませんでした。また、インデックスの確認コマンドを実行しました。私の意図は、これらが地図の場所であることです。

db.bar.ensureIndex({a:1});
db.bar.ensureIndex({geo:"2d"});
38
frankV

いくつかの問題、 fooデータベースのfooコレクションにインデックスを作成しましたが、barコレクションを照会しています。あなたは正しいコレクションにいる必要があります。

挿入したドキュメントを読むには、「2dsphere」インデックスを geoJsonオブジェクトをサポート に追加する必要があります。このインデックスはドキュメントの「ポイント」要素にある必要があるため、試してください

db.bar.createIndex({point:"2dsphere"});

その後、クエリにgeoJson objを提供することにより、次のようにクエリを実行できます。

db.bar.find(
   { point :
       { $near :
          {
            $geometry : {
               type : "Point" ,
               coordinates : [-84.27326978424058, 30.443902444762696] },
            $maxDistance : 1
          }
       }
    }
)
68
daveh
db.prod.createIndex({ "location": "2d" })

これは私にとって同じ問題を解決しました。

Prodは私のコレクション名で、locationは地理的位置を保存する列の名前です(GeoPoint)

同じことに関するいくつかの議論を見つけることができます here

8
Krish Nakum R

そのため、ここでいくつか間違っているようです。

  • 表示しているデータおよびクエリ情報から、関連情報がフィールドポイントの下にGeoJSON形式で含まれています。インデックス作成:
 db.foo.createIndex({geo: "2d"})

現在「geo」というフィールドはなく、データのあるフィールドはその場所にあるはずなので、「失敗」しません。正しいフィールドである「ポイント」を代わりに使用した場合、このタイプのインデックスはGeoJSONデータに対して無効であることを通知するエラーを受け取ります。 「2dsphere」インデックスが必要です:

db.points.createIndex({ "point": "2dsphere" })
  • 同じ問題を拡張して、データはGeoJSON形式であり、クエリの形式はレガシー座標ペアの形式です。クエリ引数を変更して、失敗しないようにする必要があります。
 db.points.find({point:{
 $ near:{
 $ geometry:{
 type: "Point"、
座標:[-84.26060492426588、30.45023887165371] 
} 
} 
}})
 

$near のドキュメントを参照してください

6
Neil Lunn

上記の回答に加えて、すでにインデックスを作成しようとして、構文またはフィールドが間違っている場合は、次を実行できます。

db.<yourcollection>.dropIndexes();すべてのインデックスをクリーンアップし、適切に再作成します。

また、インデックスは、座標自体ではなく、「座標」の親に作成する必要があります。

_{
   "_id": 59ac03d168eaaa14c2a57a00",
   "location":{
      "type":"Point",
      "coordinates":[
         131.6667,
         57.8368
      ]
   },
   "age":53,
   "username":"Brandi_Greenfelder"
}
_

db.<yourcollection>.createIndex({ location: '2dsphere' });

注意、 "2d"と "2dsphere"があり、2番目は新しいものとして使用します。

1
George Katsanos