mongodb 3.4.2 InvalidIndexSpecificationOption error: The field 'unique' is not valid for an _id index specification

icedawn picture icedawn · Feb 21, 2017 · Viewed 9.5k times · Source

The command db.testCollection.createIndex( { _id: 1 }, {name: "_id_2", unique: true, background: true} ) fails on mongo version 3.4.2, but not 3.2.11. The mongo documentation indicates the version 3.4 supports both the unique and background attributes.

Mongo 3.4.2 fails ...

> use testDB
switched to db testDB
> db.testCollection.createIndex( { _id: 1 }, {name: "_id_2", unique: true, background: true} )
{
    "ok" : 0,
    "errmsg" : "The field 'unique' is not valid for an _id index specification. Specification: { ns: \"testDB.testCollection\", v: 1, key: { _id: 1.0 }, name: \"_id_2\", unique: true, background: true }",
    "code" : 197,
    "codeName" : "InvalidIndexSpecificationOption"
}
> 

Mongo 3.2.11 works ...

> use testDB
switched to db testDB
> db.testCollection.createIndex( { _id: 1 }, {name: "_id_2", unique: true, background: true} )
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 1,
    "note" : "all indexes already exist",
    "ok" : 1
}
> 

Anyone know of a work around?

We're using the Mongoose Node.js wrapper to create the Mongo indexes, so not adding the unique and background attributes isn't an option.

Cheers!

Ed

Answer

JJussi picture JJussi · Feb 22, 2017

That unique is not problem here.. It's that _id, what already have index (created automatically) and you cannot create second index what have exactly same fields (_id:1) what first one have.

How about testing with some other field than _id and you will find out that unique and background is possible, as long as that field don't have index already present.