我正在与几个小时的索引创建的奇怪行为作斗争。我正在尝试重新构建我的示例数据,所以在插入新数据之前删除我的集合,在插入新数据之前我再次创建索引,如下所示。
db.GetCollection("Posts").EnsureIndex("Name","Title","Owner");
之后我尝试执行排序查询,但MongoDb抛出异常并说明
QueryFailure标志对于没有索引的sort()来说太多了。添加索引或指定较小的限制
但是,如果我在执行查询之前放置此行代码db.GetCollection("Post").EnsureIndex("Name");
,它的工作没有问题。然后我意识到,如果我在重建数据之前使用它,它的工作原理。应该有重载方法或我错过的东西的错误。
我正在使用10Gen .net驱动程序版本1.2,我检查了execure查询之前存在哪些索引。这是
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)
我无法从你的例子中确切地知道你认为什么不起作用。
要记住的一件事是EnsureIndex只知道你自己的进程中发生了什么。因此,如果您使用mongo shell删除索引或删除集合,那么EnsureIndex将不会接收它。如果要确保索引存在,无论其他进程在此期间可能执行了什么操作,都可以使用CreateIndex而不是EnsureIndex。
如果您能提供有关如何重现所见内容的详细信息,请与我们联系。