2012-02-28 6 views
2

配列の要素のインデックスが期待通りに機能しないことを保証します。より高速なクエリのために、MongoDBの配列の最初の要素のインデックスを保証するにはどうすればよいですか?

など。以下のデータ

> db.test.find() 
{ "_id" : 7891236423, "arr" : [ "a", "b", "c" ] } 
{ "_id" : 7891236424, "arr" : [ "b", "c", "d" ] } 
{ "_id" : 7891236425, "arr" : [ "b", "c", "a" ] } 
> 

で予想通り何の指標

> db.test.find({"arr.0":"a"}) 
{ "_id" : 7891236423, "arr" : [ "a", "b", "c" ] } 
> 

が存在しない場合は、次のクエリは動作しますが、私はarr.0

にインデックスを作成しようとすると、同じクエリが結果を返しません
> db.test.ensureIndex({"arr.0":1}) 
> db.test.find({"arr.0":"a"}) 
> 

ここで何が起こっているのか分かりませんが、私の意見では、インデックスは返されたデータに影響しないはずです。それともすべきか?

これはバグですか?またはインデックス違反?私はこの動作の説明がうまくいくことを嬉しく思っています。また、単一の配列要素でどのようにインデックスを達成できるかについてのヒントもあります。

PS:にインデックスを作成してから、をクエリする前に、arr.0をクエリすることができます。これは、この例の有効な回避策です。しかし、これは、arr.0で大量のデータをソートする必要があるとすぐには役に立ちません(MongoDBはインデックスを要求します)。

+1

使用しているMongoDBのバージョンは? – stbrody

+0

1.8.5を使ってこの問題を再現できましたが、2.0.2ではうまくいくようです。 – stbrody

答えて

1

これは、1.8以前のバージョンで使用されているv0インデックスの既知の問題です。 2.0以降の新しいv1インデックスはこれをサポートしています。 2.0.3にアップグレードすることで問題は解決します。 2.0へのアップグレード手順については、こちらをご覧ください:http://www.mongodb.org/display/DOCS/2.0+Release+Notes#2.0ReleaseNotes-Upgrading

+0

stbrody、おかげさまで、2.0.3にアップグレードしてくれてありがとうございました。私は明示的にdropIndexとensureIndexをしなければなりませんでした。 – peterp

関連する問題