Say we want the email
field on our User
model to be unique, so we set the Schema to be:
const UserSchema = new Schema({
email: {type: String, required: true, unique: true}
});
Somehow, it just doesn’t work. As it turns out, there are plenty of reasons why this wouldn’t work. Let’s see which one got you.
O_O
1. DB already messed up
If there are already duplicated emails in your collections, then the new constraints won’t work.
Fix the already duplicated ones in your db first.
>O_O
2. Index creation takes time
For uniqueness to be ensured, mongo needs to create its index. Make sure that before you create any users, its index is already created.
const UserSchema = new Schema({
email: {type: String, required: true, unique: true}
});
const User = mongoose.model('User', UserSchema);
User.init().then(() => {
// safe to create users now.
});
Or simply export the init and await for the finish before starting tests:
// models/User.js
module.exports = mongoose.model('User', UserSchema).init();
// tests/config.js
before(async () => {
await require('../models/User');
});
O_O
3. You dropped your DB/Collection
When you’re testing, you end up resetting your database or collection by dropping them. However, remember that their indexes will be dropped at the same time, and they do not automatically rebuild.
So in tests that are not humungous, instead of dropping, consider doing:
User.collection.deleteMany({});
Which clears out the collection.
OMG thank you so much
Hi, It works, but how to notify the user that the username is used?
very useful
tnx
Dear,
Thank you for clear explanation.
1. DB already messed up.(result=>
There were duplicate “email” on db. I removed them but it didn’t work.
);
User.collection.deleteMany({}); this worked for me.
Deleting complete collection works. However, deleting duplicate records doesnt. My collection consists of many documents. Any other way without deleting the whole collection?
thanks, the last one worked for me
ty, was very useful for me on 2023 !