Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MongoDB Morphia - Unique

I am trying to have a consistent db where the username and email are unique.

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

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

My user class looks like this:

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() {
...

I used the @Indexed(unique=true) annotation but it does not work. There are still duplicates in my db.

Any ideas how I can fix this?

Edit:

I read about ensureIndexes but this seems like a wrong approach, I don't want to upload duplicate data, just to see that its really a duplicate.

I want to block it right away.

somthing like

try{

ds.save(user);
}
catch(UniqueException e){
...
}
like image 588
Maik Klein Avatar asked Aug 04 '12 21:08

Maik Klein


1 Answers

A unique index cannot be created if there are already duplicates in the column you are trying to index.

I would try running your ensureIndex commands from the mongo shell:

db.user.ensureIndex({'username':1},{unique:true})
db.user.ensureIndex({'email':1},{unique:true})

.. and also check that the indexes are set:

db.user.getIndexes()

Morphia should have WriteConcern.SAFE set by default, which will throw an exception when trying to insert documents that would violate a unique index.

like image 137
Stennie Avatar answered Oct 26 '22 18:10

Stennie