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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > 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
[youtube https://www.youtube.com/watch?v=QEy1IctH99w]
Creating Key/Index
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | > 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
1 2 3 4 5 6 7 | > 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”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | > 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”
1 2 3 4 5 6 7 | > 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!
1 2 3 4 5 6 7 8 9 10 11 12 | > 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.