We have learnt how to create a key/index so far – today lets learn how to create unique key/index in MongoDB.
Related Read:
ObjectId ( _id ) as Primary Key: MongoDB
index creation: MongoDB
foo: database name
name: collection name
Primary Key in MongoDB: _id
> db.name.insert({_id: 1, a: 1});
WriteResult({ "nInserted" : 1 })
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "foo.name" }
> db.name.insert({_id: 1, a: 2});
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000
duplicate key error index: foo.name.$_id_ dup key: { : 1.0 }"
}
})
Since “_id” is treated as primary key in mongoDB, we can’t insert duplicate values to it. In above case, we are trying to insert value of “_id” as 1 twice – the second time around it threw an error stating the entered value as duplicate.
Related Read:
DBMS Basics: Getting Started Guide
Primary Foreign Unique Keys, AUTO_INCREMENT: MySQL
Primary Key & Foreign Key Implementation: MySQL
Creating Unique Key/index: MongoDB
Creating Key/Index
> db.name.insert({a: 1});
WriteResult({ "nInserted" : 1 })
> db.name.find()
{ "_id" : ObjectId("53d8cadbbbfe6d81d0bcc364"), "a" : 1 }
{ "_id" : 1, "a" : 1 }
> db.name.ensureIndex({a: 1});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "foo.name" }
{ "v" : 1, "key" : { "a" : 1 }, "name" : "a_1", "ns" : "foo.name" }
Here we create index on field “a”.
Inserting duplicate values into key field
> db.name.insert({a: 1});
WriteResult({ "nInserted" : 1 })
> db.name.find()
{ "_id" : ObjectId("53d8cadbbbfe6d81d0bcc364"), "a" : 1 }
{ "_id" : 1, "a" : 1 }
{ "_id" : ObjectId("53d8cb4dbbfe6d81d0bcc365"), "a" : 1 }
insert operation simply inserts the duplicate value to field “a” even though its made as a key/index.
Removing documents and Key/Index on field “a”
> db.name.find()
{ "_id" : ObjectId("53d8cadbbbfe6d81d0bcc364"), "a" : 1 }
{ "_id" : 1, "a" : 1 }
{ "_id" : ObjectId("53d8cb4dbbfe6d81d0bcc365"), "a" : 1 }
> db.name.remove({a: 1});
WriteResult({ "nRemoved" : 3 })
> db.name.find()
> db.name.dropIndex({a: 1});
{ "nIndexesWas" : 2, "ok" : 1 }
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "foo.name" }
Before implementing unique key on field “a” we need to first remove the duplicate entries present inside our collection orelse it’ll through errors. Here we also remove the index/key on “a”, so that we can create unique key/index on “a”.
Creating Unique key/index on field “a”
> db.name.ensureIndex({a: 1}, {unique: true});
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
To create unique key/index, we need to make use of ensureIndex() method – first parameter being the field name to be made as unique key along with it’s value 1 or -1. 1 signifies ascending order, -1 signifies descending order. The second parameter {unique: true}, specifies that the key/index must be unique key/index, like that of “_id”.
Duplicate key error on our Unique Key!
> db.name.find()
{ "_id" : ObjectId("53d8cb85bbfe6d81d0bcc366"), "a" : 1 }
> db.name.insert({a: 1});
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000
duplicate key error index: foo.name.$a_1 dup key: { : 1.0 }"
}
})
Now if we try to insert duplicate values into field “a” it throws duplicate key error.