2016-04-04 7 views
1

Geo2Dインデックスとしてレガシコーディネートペアを持つジオスペースmongodbがあります。このデータベースから、私は場所のリスト(レガシコーディネートペア)を抽出したいと思います。通常の列では、以下のように可能なペアのリストに対して「$ in」クエリを使用できます。MongoDBで2dまたは2dsphereのインデックス付きフィールドで通常のクエリを使用する方法

>>> db.collection.find_one({'country': {'$in': ['Argentina', 'Chile']}}) 

私はlocカラムでこれを行う方法がわかりません。 loc列の同様の操作でエラーが発生する

>>> db.collection.find_one({'loc': {'$in': [(-35, 20), (-30, 21)]}}) 

geo field only has 1 element :: caused by :: $in: [ [ -35, 20 ], [ -30, 21 ] ] 

解決方法は、リストの各メンバーを個別に照合することです。しかし、おそらく最も効果的な解決策ではありません。私ができるアグリゲーション/マップ・リダクション・トリックはありますか?

関連情報DBがどのように見える

>>> db.collection.find_one() 

{u'value': 2.7062699269224995, 
u'_id': ObjectId('56cf807e54013b935b88d3da'), 
u'country': u'Algeria', 
u'date': datetime.datetime(2015, 1, 1, 0, 0), 
u'iso2': u'DZ', 
u'lat': 27.0, 
u'loc': [27.0, -8.0], 
u'lon': -8.0, 
u'place': u'27.0_-8.0_DZ'} 

インデックス・キーは、次のとおりです。

[ { "_id" : 1 }, { "date" : -1 }, { "loc" : "2d" } ] 
+0

ここで実際に実行しているクエリは本当ですか?指定された引数に「正確に」一致する配列に対しては、規則的な一致でなければならないため、「地理空間」はありません。これはどのMongoDBサーバーのバージョンですか? 2.6.xより前のものは、エンジンがそのリリースで大幅な変更を行ったため、インデックスの処理方法について「混乱」している可能性があります。 –

+0

インデックスは地理空間的なものなので、依然として$近いクエリを実行したいと考えています。私のクエスチョンを言い換えると、2dインデックスのクエリで$です。これはmongodbです。2.4.9 – goofd

+0

MongoDB 2.4を使用しているので、私が作成していたポイントは、エラーの原因となるクエリエンジンの処理に違いがあります。 –

答えて

1

ここでの問題は、サーバーのバージョンがMongoDBの2.4であるということです.xシリーズ。 MongoDB 2.6.xより前の "ジオスペース"インデックスのクエリエンジン処理は、標準クエリーとは別に行われていたため、$nearのような地理空間操作ではなく、通常の$in式を要求すると、クエリはフィールドには"2d"ジオスペースインデックスが適用されているため、式を処理できないエンジンです。

MongoDB 2.4.xでは、通常のクエリ操作で地理空間インデックスを使用できません。あなたが「必要」クエリの「インデックス」を使用する場合は、クエリで参照されているフィールドに.ensure_index()を使用して定期的にインデックスを作成「しなければならない」:これは、「追加」にしていることを

db.collection.ensure_index({ "loc": 1 }) 

注意を既に適用されている "2d"インデックス索引は異なるタイプのものであるため、名前は別々に存在します。したがって、両方を持つことに問題はありません。

$natural指定子を持つカーソルの代わりに.hint()を指定すると、「コレクションスキャン」が強制され、地理空間インデックスが「無視」されます。

MongoDB 2.6.x以降では、クエリエンジンが統一されているため、ここでの制限は適用されません。指定されたクエリに応じて、使用するためにそのインデックスを明示的に選択するために、再度.hint()を指定しない限り、「地理空間」インデックスは使用されない可能性があります。しかし、それは問題なく動作します。

最後に、MongoDB 2.6.x以降では、GeoJSON形式で保存されたデータに「地理空間」インデックスを作成することができます。すなわち:

"location": { 
    "type": "Point", 
    "coordinates": [27.0, -8.0] 
} 

このようなインデックスは、この例で"location"フィールド上であろうと、直接"location.coordinates"アレイ上、そのような$inクエリは通常、クエリのために利用可能なものとして"location"の「インデックス」を認識しないわけではないので配列の内容に一致します。この場合、通常のインデックスを"location.coordinates"に直接作成して、クエリでその「インデックス」を使用できるようにします。

+0

お知らせします。非常に詳細な説明をありがとう。これらは優れた点です。特に、自分のような新入会員の方がいいです。あなたが提案した 'ヒント'メソッドを試してみます。 – goofd

関連する問題