MongoDb的EnsureIndex看起来有一个bug
本文关键字:有一个 bug 看起来 EnsureIndex MongoDb | 更新日期: 2023-09-27 18:14:11
我正在与小时索引创建的奇怪行为作斗争。我试图重新构建我的样本数据,所以我在插入新数据之前删除我的集合,在插入新数据之前,我再次创建索引,如下所示。
db.GetCollection("Posts").EnsureIndex("Name","Title","Owner");
之后,我试图执行排序查询,但MongoDb抛出异常,并说
QueryFailure标记对于没有索引的sort()来说数据太多。添加索引或指定较小的限制
但是如果我把这行代码db.GetCollection("Post").EnsureIndex("Name");
之前执行查询,它的工作没有问题。然后我意识到,如果我在重建数据之前使用它,它就会起作用。应该有一个bug在重载方法或我错过的东西。
我使用的是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" }
我不能从你的例子中确切地看出你认为什么是不工作的。
要记住的一件事是,EnsureIndex只知道在您自己的进程中发生了什么。因此,如果你删除一个索引或删除一个集合使用mongo shell EnsureIndex不会捡起。如果你想确保索引存在,而不管其他进程在此期间可能做了什么,你可以使用CreateIndex而不是EnsureIndex。
如果你能提供更多关于如何重现你所看到的东西的细节,请告诉我。