Let’s
say I had employee collection with five documents.
> db.employee.find()
{ "_id" : 1, "firstName" : "Hari Krishna", "lastName" : "Gurram", "mailId" : "abcabc@abc.com" }
{ "_id" : 2, "firstName" : "Rama Krishna", "lastName" : "Gurram", "mailId" : "defabc@abc.com" }
{ "_id" : 3, "firstName" : "Murali Krishna", "lastName" : "Bachu", "mailId" : "abcdef@abc.com" }
{ "_id" : 4, "firstName" : "Gopi", "lastName" : "Battu" }
{ "_id" : 5, "firstName" : "Joel", "lastName" : "Chelli" }
>
I
want to create unique index on field “mailID”.
> db.employee.ensureIndex({"mailId":1}, {"unique":true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"ok" : 0,
"errmsg" : "E11000 duplicate key error index: test.employee.$mailId_1 dup key: { : null }",
"code" : 11000
}
>
I
got “duplicate key error”, it is because documents 4 and 5 don’t have mailId
associated with them, so by default these are mapped to null. So there is no
uniqueness between documents 4 and 5.
How to solve this
problem?
You
can create sparse index. Sparse indexes only contain entries for documents that
have the indexed field, even if the index field contains a null value. The
index skips over any document that is missing the indexed field.
> db.employee.ensureIndex({"mailId":1}, {"unique":true, "sparse" : true})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
If
you query the collection using sparse index, then you won’t get the documents
that don’t have mailId field.
> db.employee.find().hint({mailId:1})
{ "_id" : 1, "firstName" : "Hari Krishna", "lastName" : "Gurram", "mailId" : "abcabc@abc.com" }
{ "_id" : 3, "firstName" : "Murali Krishna", "lastName" : "Bachu", "mailId" : "abcdef@abc.com" }
{ "_id" : 2, "firstName" : "Rama Krishna", "lastName" : "Gurram", "mailId" : "defabc@abc.com" }
>
hint()
method force mongoDB to use specified index.
No comments:
Post a Comment