MongoException:名称为code的索引已经存在,但使用不同的选项

25

我有一个 mongodb 集合 term,具有以下结构

{
    "_id" : "00002c34-a4ca-42ee-b242-e9bab8e3a01f",
    "terminologyClass" : "USER",
    "code" : "X67",
    "terminology" : "some term related notes",
    "notes" : "some notes"
}

一份代表术语集合的Java类,命名为Term.java

@Document
public class Term{  

    @Id
    protected String termId;

    @Indexed
    protected String terminologyClass;

    @Indexed(unique=true)
    protected String code;

    @Indexed
    protected String terminology;

    protected String notes;

    //getters & setters
}

我有许多term集合中的文档。现在,我正在将一个新字段添加到 Term.java 中:

@Indexed
protected String status;

在向term集合中插入新术语时,添加Term.java字段status后,我遇到了如下异常:

com.mongodb.MongoException: Index with name: code already exists with different options

我使用的MongoDB版本为2.6.5,spring-data-mongodb版本为1.3.2。


1
虽然与此问题不完全相关,但错误消息相同,因此对于搜索的人可能有用:您无法将具有不同参数的两个TEXT索引添加到集合中。 只能有一个(尽管它可以引用多个字段)。 请参阅 https://docs.mongodb.com/manual/core/index-text/ - naught101
3个回答

26

您在该集合上已经有一个同名但定义不同的索引。我猜测您当前的代码索引是非唯一的。

尝试:

db.Term.getIndexes()

如果确实是这种情况(您在“code”字段上有一个非唯一索引),请发出以下命令:

db.Term.dropIndex("code_1") (将“code”字段索引名称替换为实际名称)。

下次启动应用程序时,应该能够正常工作。

或者,从 @Indexed 注释中删除唯一属性(如果您不需要它是唯一的)。


你的猜测是正确的。删除了代码上的索引并从代码中删除了重复项,然后重新启动应用程序解决了问题。谢谢 :) - faizi
我降级了我的 Ruby MongoDB 库的版本,突然发现所有带有“expireAfterSeconds”的索引已经存在,并且具有不同的选项,因此我不得不将它们全部删除。 - Hubro

4

你尝试过删除集合并重新尝试吗?通常在将新的Java映射应用于现有的MongoDB集合时会出现许多冲突。


这个方法可以用,但是请确保你不需要集合内部的数据或者将其复制到其他地方再进行恢复! - Mosheer

1
尝试创建多个复合文本索引也可能导致此错误。
每个集合只允许一个文本搜索索引根据文档
在多租户数据库中,我们希望通过使用复合索引来强制实现每个客户数据内的唯一性。
db.users.createIndex( { customer: "text", email: "text"}, { unique: true } );
db.users.createIndex( { customer: "text", cell: "text"}, { unique: true } );

这样做导致了操作者的错误。

然而,将它们改为常规索引解决了问题。

db.users.createIndex( { customer: 1, email: 1}, { unique: true } );
db.users.createIndex( { customer: 1, cell: 1}, { unique: true } );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接