MongoDb EnsureIndex看起来有一个bug

时间:2011-11-09 16:43:53

标签: c# .net mongodb

我正在与几个小时的索引创建的奇怪行为作斗争。我正在尝试重新构建我的示例数据,所以在插入新数据之前删除我的集合,在插入新数据之前我再次创建索引,如下所示。

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" }

1 个答案:

答案 0 :(得分:1)

我无法从你的例子中确切地知道你认为什么不起作用。

要记住的一件事是EnsureIndex只知道你自己的进程中发生了什么。因此,如果您使用mongo shell删除索引或删除集合,那么EnsureIndex将不会接收它。如果要确保索引存在,无论其他进程在此期间可能执行了什么操作,都可以使用CreateIndex而不是EnsureIndex。

如果您能提供有关如何重现所见内容的详细信息,请与我们联系。