2011-11-09 6 views
1

Je suis en train de lutter contre le comportement étrange de la création d'index depuis des heures. J'essaye de reconstruire mes données d'échantillon ainsi je baisse ma collection avant d'insérer de nouvelles données et avant d'insérer de nouvelles données je crée des index encore comme ci-dessous.MongoDb EnsureIndex semble avoir un bug

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

Après que je cherche à exécuter la requête mais MongoDB triée throws Exception et dit que

drapeau QueryFailure était trop de données pour le tri() sans index. ajoutez un index ou spécifiez une plus petite limite

Mais si je mets ce code de ligne db.GetCollection("Post").EnsureIndex("Name"); avant d'exécuter la requête, cela fonctionne sans problème. Ensuite, j'ai réalisé que si je l'utilise avant de reconstruire les données cela fonctionne. Il devrait y avoir un bug dans la méthode de surcharge ou quelque chose que j'ai raté. J'utilise la version 1.2 du pilote 10Gen .net et j'ai vérifié quels index existent avant la requête d'exécution. Ici, il est

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

Reproduire dans la coquille. Si cela fonctionne, vous faites quelque chose de mal ou le pilote que vous utilisez a des problèmes. –

Répondre

1

Je ne peux pas dire de votre exemple exactement ce que vous pensez ne fonctionne pas. Une chose à garder à l'esprit est que EnsureIndex sait seulement ce qui se passe dans votre propre processus. Donc, si vous supprimez un index ou supprimez une collection en utilisant le shell mongo, EnsureIndex ne prendra pas cela en compte. Vous pouvez utiliser CreateIndex au lieu de EnsureIndex si vous voulez vous assurer que l'index existe indépendamment de ce que les autres processus ont pu faire entre-temps. Faites-moi savoir si vous pouvez fournir plus de détails sur la façon de reproduire ce que vous voyez.

Questions connexes