【问题标题】:Unable to recreate a mongo index with the same name无法重新创建同名的 mongo 索引
【发布时间】:2017-04-11 07:04:00
【问题描述】:

我有一个需要修改的索引。

    {
    "v" : 1,
    "key" : {
        "expectedDateTime" : 1
    },
    "name" : "expectedDateTime_1",
    "ns" : "expectation.expectation_data",
    "expireAfterSeconds" : 43200
}

expireAfterSeconds不正确,需要改成432000。

当我删除索引时,它看起来很好

db.expectation_data.dropIndex({"expectedDateTime":1})
{ "nIndexesWas" : 4, "ok" : 1 }

getIndexes() 显示索引不存在。

然后当我尝试重新创建索引时出现此错误

db.expectation_data.createIndex({"expectedDateTime":1}, 
{expireAfterSeconds:432000,name:"expectedDateTime"});
{
    "ok" : 0,
    "errmsg" : "Index with name: expectedDateTime already exists with different options",
    "code" : 85
}

现在在运行 getIndexes() 时,我看到索引似乎是用旧的 TTL 重新创建的。我尝试多次重复此过程,但一次又一次遇到相同的问题。

我找不到任何说明我无法重新创建同名索引的文档。如果我使用不同的名称,它可以正常工作

db.expectation_data.createIndex({"expectedDateTime":1}, {expireAfterSeconds:432000});
.
.
>db.expectation_data.getIndexes()
.
.
{
    "v" : 1,
    "key" : {
        "expectedDateTime" : 1
    },
    "name" : "expectedDateTime_1",
    "ns" : "expectation.expectation_data",
    "expireAfterSeconds" : 432000
}

重新创建同名索引有什么限制吗?

【问题讨论】:

  • 这看起来索引是自动重新创建的(可能是正在运行的后台进程或连接到 MongoDB 的客户端以编程方式调用 ensureIndex?)
  • @Matt - 正如你所料。几分钟前我才弄清楚并发布了答案。
  • 如果您愿意,请将其作为答案发布,我会接受 :)
  • 谢谢,很高兴能帮上忙 :)

标签: mongodb spring-mongo


【解决方案1】:

这看起来像删除后自动重新创建索引。确保没有使用 ensureIndex@Index-Annotations 的应用程序连接到数据库。

【讨论】:

    【解决方案2】:

    事实证明。这是由于在具有旧超时的实体中使用了 @Index 注释。当我进行索引更改时,应用程序仍在运行。

    当我停止应用程序时,我能够按照我最初的预期创建索引

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 2015-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-10
      • 2016-02-04
      • 1970-01-01
      相关资源
      最近更新 更多