2011-11-09 9 views
1

私は数時間からのインデックス作成の奇妙な動作と闘っています。私はサンプルデータを再構築しようとしていますので、新しいデータを挿入する前にコレクションを削除し、新しいデータを挿入する前にインデックスを作成し直してください。その後MongoDb EnsureIndexルックスにバグがあります

db.GetCollection("Posts").EnsureIndex("Name","Title","Owner"); 

私は、ソートされたクエリを実行しようとしていますが、MongoDBは、例外をスローし、

QueryFailureフラグが(ソートのためにあまりにも多くのデータだったと言います)がないインデックスを持ちます。インデックスを追加するか、より小さい制限を指定する

しかし、この行コードをdb.GetCollection("Post").EnsureIndex("Name");の前に置いて実行すると問題なく動作します。それから私はそれが動作するデータを再構築する前にこれを使用することに気づいた。メソッドのオーバーロードや私が見逃したことにバグがあるはずです。

私は10Genの.netドライババージョン1.2を使用していますが、実行クエリの前にどのインデックスが存在するかを確認しました。ここでは、それは

db.GetCollection("Posts").EnsureIndex("Name","Title","Owner"); 
db.GetIndexes();//result 

[0]: { "v" : 1, "key" : { "_id" : 1 }, "ns" : "Posts", "name" : "_id_" } 
[1]: { "v" : 1, "key" : { "Name" : 1, "Title" : 1, "Owner" : 1 }, "ns" : "Posts", "name" : "Name_1_Title_1_Owner_1_" } 

db.GetCollection("Posts").EnsureIndex("Title") // i call this for other indexes too 
db.GetIndexes(); 
[0]: { "v" : 1, "key" : { "_id" : 1 }, "ns" : "Posts", "name" : "_id_" } 
[1]: { "v" : 1, "key" : { "Name" : 1 }, "ns" : "Posts", "name" : "Name_1" } 
[2]: { "v" : 1, "key" : { "Title" : 1 }, "ns" : "Posts", "name" : "Title_1" } 
[4]: { "v" : 1, "key" : { "Owner" : 1 }, "ns" : "Posts", "name" : "Owner_1" } 
+0

シェルで再現します。それがうまくいくか、あなたが使用しているドライバに問題があるかのいずれかである場合。 –

答えて

1

である私は、あなたが働いていないと思うまさにあなたの例から言うことができません。

必ずお守りください.WhereIndexは自分のプロセス内で何が起こっているか知っています。そのため、Mongoシェルを使ってインデックスを削除したり、コレクションを削除したりすると、EnsureIndexはそれを認識しません。その間に他のプロセスが行ったことに関係なく、索引が存在することを確認したい場合は、EnsureIndexの代わりにCreateIndexを使用できます。

あなたが見ているものを再現する方法の詳細については、教えてください。

関連する問題