在项目中看到了类似如下的代码段:

1
2
3
4
5
6
7
8
9
10
11
@Entity
@Indexes({
@Index(fields = {@Field("name")},options = @IndexOptions(unique = true,dropDups = true))
})
public class UniqueEntity {
@Id
ObjectId id;
@Property
String name;
}

这里的unique属性可以理解,是建立唯一索引,那dropDups这个属性呢?

查看其代码:

1
2
3
4
/**
* Tells the unique index to drop duplicates silently when creating; only the first will be kept
*/
boolean dropDups() default false;

结合Create a Unique Index — MongoDB Manual 2.6文档可以知道,在建立索引时,如果现有的数据有不符合唯一索引的,如果只指定unique属性,则会提示建立索引失败,而如果还额外指定了dropDups属性,则会只会保留第一条数据,其他的不符合唯一索引的数据都会被删除。

但是我在实验的时候,发现无论是否指定dropDups,都会提示建立索引失败,这是为什么?

参考:

原来在Mongo 2.7.5之后,dropDups字段就已经不建议使用了,所以如果你想要在一个已经有不符合你要建立的唯一索引的集合上创建索引,需要自己额外处理了。

参考资料