MongoDB Morphia - 独特

Mai*_*ein 5 java mongodb morphia playframework-2.0

我正在尝试使用一致的数据库,其中用户名和电子邮件是唯一的.

http://www.mongodb.org/display/DOCS/Indexes#Indexes-unique%3Atrue

http://code.google.com/p/morphia/wiki/EntityAnnotation

我的用户类看起来像这样:

public class User {
    @Indexed(unique = true)
    @Required
    @MinLength(4)
    public String username;

    @Indexed(unique = true)
    @Required
    @Email
    public String email;

    @Required
    @MinLength(6)
    public String password;

    @Valid
    public Profile profile;

    public User() {
...
Run Code Online (Sandbox Code Playgroud)

我使用@Indexed(unique = true)注释但它不起作用.我的数据库中仍有重复项.

我有什么想法可以解决这个问题?

编辑:

我读到了关于ensureIndexes但这似乎是一个错误的方法,我不想上传重复数据,只是为了看到它真的是重复.

我想立刻阻止它.

有点像

try{

ds.save(user);
}
catch(UniqueException e){
...
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*nie 5

一个唯一索引,如果有已经在你试图索引中的列重复无法创建.

我会尝试ensureIndexmongoshell 运行你的命令:

db.user.ensureIndex({'username':1},{unique:true})
db.user.ensureIndex({'email':1},{unique:true})
Run Code Online (Sandbox Code Playgroud)

..并检查索引是否已设置:

db.user.getIndexes()
Run Code Online (Sandbox Code Playgroud)

Morphia应该默认设置WriteConcern.SAFE,这会在尝试插入违反唯一索引的文档时抛出异常.


Mau*_*ähä 1

这里有关于唯一约束的很好的解释Uniqueconstraint with JPA and Bean Validation,这对你有帮助吗?所以我要做的只是在检查其他错误时在控制器级别(或 bean validate())验证您的数据。这样就可以完成工作,但它不如使用注释那么酷。

编辑

或者,请参阅这篇文章Inserting data to MongoDB - no error, no insert,它清楚地描述了 mongodb 默认情况下不会引发唯一索引的错误,如果您不这样做,请尝试配置您的 mongodb 来抛出这些错误,看看是否你可以使用解决方案:(

编辑2

我还想到,游戏 2 有一个启动全局类,您可以在其中尝试访问数据库并运行索引列命令,例如 db.things.ensureIndex({email:1},{unique:true}); ?? 更多信息请访问http://www.playframework.org/documentation/2.0/JavaGlobal