首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB Morphia -独特

MongoDB Morphia -独特
EN

Stack Overflow用户
提问于 2012-08-05 05:39:10
回答 5查看 6.9K关注 0票数 5

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

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

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

我的user类如下所示:

代码语言:javascript
复制
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() {
...

我使用了@Indexed(unique=true)注释,但它不起作用。我的数据库里还有重复的东西。

你知道我该怎么解决这个问题吗?

编辑:

我读到过关于ensureIndexes的文章,但这似乎是一个错误的方法,我不想上传重复的数据,只是想看看它是否真的是重复的。

我想马上阻止它。

类似的东西

代码语言:javascript
复制
try{

ds.save(user);
}
catch(UniqueException e){
...
}
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-08-05 06:19:11

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

编辑

或者看看这篇文章Inserting data to MongoDB - no error, no insert,它清楚地描述了mongodb在默认情况下不会引发唯一索引的错误,如果你没有告诉它,试着配置你的mongodb也抛出这些错误,看看你是否可以使用解决方案:

编辑2

我还想到,play 2有一个启动全局类,您可以在其中尝试访问数据库并运行索引列命令,如此电子邮件({db.things.ensureIndex:1},{唯一:真});??欲了解更多信息,请访问http://www.playframework.org/documentation/2.0/JavaGlobal

票数 1
EN

Stack Overflow用户

发布于 2012-08-05 08:11:15

如果要索引的列中已有重复项,则无法创建unique index

我会尝试从mongo外壳运行您的ensureIndex命令:

代码语言:javascript
复制
db.user.ensureIndex({'username':1},{unique:true})
db.user.ensureIndex({'email':1},{unique:true})

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

代码语言:javascript
复制
db.user.getIndexes()

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

票数 5
EN

Stack Overflow用户

发布于 2013-09-09 03:35:24

我也遇到了同样的问题,play framework 1.2.6和morphia 1.2.12。

@Indexed(unique = true)注释的解决方案是让重新创建集合。因此,如果我已经有了mongo中的" Account“集合,并注释了email列,并重新启动了play应用程序,则帐户索引没有任何变化。

如果我删除了帐户收集,morphia会重新创建它,现在电子邮件列是唯一的:

代码语言:javascript
复制
> db.Account.drop()
true

重启播放后:(我有一个创建初始帐户的工作...)

代码语言:javascript
复制
> db.Account.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "something.Account",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "email" : 1
                },
                "unique" : true,
                "ns" : "something.Account",
                "name" : "email_1"
        }
]

现在,在插入已经存在的电子邮件之后,我得到了一个MongoException.DuplicateKey异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11812177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档