2017-09-24 20 views
3

我使用Spring-Boot 1.5.1MongoDB 3.4.6如何获得这@Indexed(唯一= TRUE)失败

我有一个MongoDB文件,其中对某些领域的一些@Indexed(unique=true)注解。

@Document(collection="Product") 
public class Product{ 
    @Id 
    private String id; 
    @Indexed(unique=true) 
    private String name; 
    @Indexed(unique=true) 
    private String searchName; 

当有任何重复的名称或searchName它会抛出org.springframework.dao.DuplicateKeyException

堆栈跟踪:

Caused by: org.springframework.dao.DuplicateKeyException: E11000 duplicate key error index: Product.name dup key: { : "name" }; nested exception is com.mongodb.MongoException$DuplicateKey: E11000 duplicate key error index: Product.name dup key: { : "name" } 
at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:52) 

我们怎样才能在其上被抛出的异常的关键。

喜欢的东西,当我们把一些申请@NotNull(message = "Product briefDescription cannot be null")和它给你的exceptionmessage,但没有message属性为@Indexed注释。

任何方式来做到这一点?

+1

这将是很好,如果你可以多放一些异常堆栈跟踪的。通常,它写入stackTrace。 –

+0

@KaustubhKallianpur已添加。 –

+0

所以你想知道在哪个键上抛出了重复的异常并将其用于进一步?根据堆栈跟踪,E11000已经作为名称存在于数据库中,该数据库已抛出异常。它不是searchName字段。 –

回答

4

异常消息中包含您要求的信息,它包含错误引发的索引名称(在您的案例中为Product.nameProduct.searchName)。

不幸的是,你必须从消息中解析出这些信息。这种限制已在别处提出:

Robustly retrieve which field caued 'duplicate key error' in Mongo

并在以下JIRA门票:

然而,在你的榜样(与重复是null),我强烈建议你尽可能在验证时尽可能多地进行验证而不依赖于数据库来处理客户端可以完成的任何验证。

0

据我所知,您不能直接在错误中获取重复文档的关键,因为它不是Mongo驱动程序的核心功能。如果引发重复键异常,您最好的办法可能是对您的集合执行查找操作。您可以考虑在Mongo Jira上打开一张票,以查看开发团队是否有兴趣在未来添加这样的功能。

0

如果复制键特殊情况发生,发现您的累积操作。 上关的机会,你需要查看记录正版键,查询像system.indexes:

db.collection('system.indexes').findOne({ ns: 'mean-dev.users', name: 'username_1' }, cb);