1
location: {lat: Number,
           lng: Number}

location は私のmongodbの2Dインデックスであり、これを地理空間検索に使用していますが、うまく機能しています。

db.find({lat:12.121212, lng:70.707070}) として検索する必要がある場合、同じインデックスを使用しますか? または、新しいインデックスを定義する必要がありますか? もしそうなら、どのように?

node.jsでmongooseドライバーを使用しています

4

1 に答える 1

1

地理空間コマンドを実行するために使用される2Dインデックスは、2つのフィールドでの同等性の一致には役立ちません。そのためには、次のように、2つのサブドキュメントに複合インデックスを定義する必要があります。

db.collection.ensureIndex({"location.lat" : 1, "location.lng" : 1})

これは、データのテストセットを使用した場合に最適に機能しました。場所フィールド自体に通常のインデックスを定義することもできますが、効率は低下します。ヒントを使用して相対的なパフォーマンスをテストし、インデックスの組み合わせについて説明することができます。例えば:

db.collection.find({"location.lat" : 179.45, "location.lng" : 90.23}).hint("location.lat_1_location.lng_1").explain()

実際に必要な任意のインデックスに対してこれを行うことができますが、返された結果を確認するには、.explain()を削除する必要があります。

また、クエリでは一度に1つのインデックスしか使用できないため、2つ(同等性と地理空間検索)を組み合わせようとしている場合は、2Dインデックスのみが使用されることに注意してください。

注:上記の例はすべて、node.jsではなく、MongoDBJSシェルからのものです。

于 2012-07-22T11:57:33.697 に答える