Jessie
Jessie

Reputation: 963

Mongodb avoid duplicate entries

I am newbie to mongodb. May I know how to avoid duplicate entries. In relational tables, we use primary key to avoid it. May I know how to specify it in Mongodb using java?

Upvotes: 30

Views: 44202

Answers (7)

anishkarthick s
anishkarthick s

Reputation: 23

Prevent mongoDB to save duplicate email

 UserSchema.path('email').validate(async(email)=>{
   const emailcount = await mongoose.models.User.countDocuments({email})
   return !emailcount
 }, 'Email already exits')

May this help ur question... worked for me.. use in user model. refer for explaination THANKS...

Upvotes: 0

theon
theon

Reputation: 14380

Use an index with the {unique:true} option.

// everyone's username must be unique:
db.users.createIndex({email:1},{unique:true});

You can also do this across multiple fields. See this section in the docs for more details and examples.

A unique index ensures that the indexed fields do not store duplicate values; i.e. enforces uniqueness for the indexed fields. By default, MongoDB creates a unique index on the _id field during the creation of a collection.

If you wish for null values to be ignored from the unique key, then you have to also make the index sparse (see here), by also adding the sparse option:

// everyone's username must be unique,
//but there can be multiple users with no email field or a null email:
db.users.createIndex({email:1},{unique:true, sparse:true});

If you want to create the index using the MongoDB Java Driver. Try:

Document keys = new Document("email", 1);
collection.createIndex(keys, new IndexOptions().unique(true));

Upvotes: 47

using pymongo it looks like:

mycol.create_index("id", unique=True)

where myCol is the collection in the DB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pymongo

myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["customers"]
mycol.create_index("id", unique=True)
mydict = {"name": "xoce", "address": "Highway to hell 666", "id": 1}
x = mycol.insert_one(mydict)

Upvotes: 0

Sammaye
Sammaye

Reputation: 43884

I am not a Java programmer however you can probably convert this over.

MongoDB by default does have a primary key known as the _id you can use upsert() or save() on this key to prevent the document from being written twice like so:

var doc = {'name': 'sam'};
db.users.insert(doc); // doc will get an _id assigned to it
db.users.insert(doc); // Will fail since it already exists

This will stop immediately duplicates. As to multithread safe inserts under certain conditions: well, we would need to know more about your condition in that case.

I should add however that the _id index is unqiue by default.

Upvotes: 0

Cuga
Cuga

Reputation: 17904

As of Mongo's v3.0 Java driver, the code to create the index looks like:

public void createUniqueIndex() {
    Document index = new Document("fieldName", 1);
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");
    collection.createIndex(index, new IndexOptions().unique(true));
}

// And test to verify it works as expected
@Test
public void testIndex() {
    MongoCollection<Document> collection = client.getDatabase("dbName").getCollection("CollectionName");

    Document newDoc = new Document("fieldName", "duplicateValue");
    collection.insertOne(newDoc);

    // this will throw a MongoWriteException
    try {
        collection.insertOne(newDoc);
        fail("Should have thrown a mongo write exception due to duplicate key");
    } catch (MongoWriteException e) {
        assertTrue(e.getMessage().contains("duplicate key"));
    }
}

Upvotes: 1

Amit Chahar
Amit Chahar

Reputation: 2619

This can be done using "_id" field although this use is discouraged. suppose you want the names to be unique, then you can put the names in "_id" column and as you might know "_id" column is unique for each entry.

BasicDBObject bdbo = new BasicDBObject("_id","amit");

Now , no other entry can have name as "amit" in the collection.This can be one of the way you are asking for.

Upvotes: 1

hithwen
hithwen

Reputation: 2193

Theon solution didn't work for me, but this one did:

BasicDBObject query = new BasicDBObject(<fieldname>, 1);
collection.ensureIndex(query, <index_name>, true);

Upvotes: 0

Related Questions