Um índice único garante que os campos indexados não armazenem valores duplicados e que um valor apareça no máximo uma vez para um determinado campo. Um índice composto exclusivo garante que qualquer combinação dos valores da chave do índice apareça no máximo uma vez. Por padrão, o MongoDB cria um índice único no campo _id durante a criação de uma coleção.
Criar um índice único
Para criar um índice único, utilize o método db.collection.createIndex() com a opção unique definida como true.
db.collection.createIndex( <key and index type specification>, { unique: true } )Índice único em um único campo
Por exemplo, para criar um índice único no campo email da coleção users, utilize a seguinte operação em mongosh:
db.users.createIndex( { "email": 1 }, { unique: true } )Índice composto único
Você também pode impor uma restrição exclusiva na combinação de valores de chave de índice para um índice composto.
Por exemplo, para criar um índice único nos campos name, email e password da coleção users, utilize a seguinte operação em mongosh:
db.users.createIndex( { name: 1, email: 1, password: 1 }, { unique: true } )Crie um índice composto único multikey em email e name:
db.users.createIndex( { "email": 1, "name": 1 }, { unique: true } )O índice único permite a inserção dos seguintes documentos na collection, pois o índice impõe exclusividade para a combinação dos valores email e name:
db.users.insertMany( [ { name: "Catelyn Stark", email: [ "catelyn@gameofthron.es", "sean_bean@gameofthron.es" ], password: "$2b$12$hash2" }, { name: "Arya Stark", email: [ "catelyn@gameofthron.es" ], password: "$2b$12$hash3" }] )Embora ambos os documentos tenham "catelyn@gameofthron.es" em suas arrays email, a operação é bem-sucedida porque a combinação de cada valor de e-mail com o campo name é única.
Comportamento
Restrições
O MongoDB não pode criar um índice único no(s) campo(s) de índices especificado(s) se a coleção já contiver dados que violariam a restrição única para o índice.
Para converter um índice não único existente em um índice único, consulte Converter um índice existente em um índice único.
Você não pode especificar uma restrição única em um índice hash.
Criando um índice único em conjuntos de réplicas e clusters fragmentados
Para conjuntos de réplicas e clusters fragmentados, o uso de um procedimento contínuo para criar um índice único exige que você interrompa todas as gravações na coleção durante o procedimento. Se você não puder parar todas as gravações na coleção durante o procedimento, não use o procedimento contínuo. Em vez disso, para criar seu índice único na coleção, você deve:
Execute
db.collection.createIndex()no primário para um conjunto de réplicasExecute
db.collection.createIndex()nomongospara um cluster fragmentado
Restrição exclusiva em documentos separados
O índice único impede que documents diferentes na coleção tenham o mesmo valor para a chave indexada.
Como a restrição se aplica a documentos separados, para um índice multichave exclusivo, um documento pode ter elementos de array que resultam na repetição de valores de chave de índice, desde que os valores de chave de índice desse documento não dupliquem os de outro documento. Neste caso, a entrada repetida do índice é inserida no índice apenas uma vez.
Por exemplo, crie um índice composto único multikey em email e name:
db.users.createIndex( { "email": 1, "name": 1 }, { unique: true } )O índice único permite inserir o seguinte documento na collection se nenhum outro documento da collection tiver um valor de chave de índice { "email": "arya@winterfell.com", "name": null }.
db.users.insertOne( { _id: ObjectId("59b99db4cfa9a34dcd7885b9"), email: [ "arya@winterfell.com", "arya@gameofthron.es" ] } )Campo de documento ausente em um índice único de campo único
Se um documento tiver valor null ou ausente no campo indexado em um índice único de campo único, o índice armazenará um valor null para esse documento. Devido à restrição exclusiva, um índice único de campo único só pode conter um documento que contenha um valor null em sua entrada de índice. Se houver mais de um documento com valor null em sua entrada de índice, a construção do índice apresentará um erro de chave duplicada.
Por exemplo, uma collection tem um índice único de campo único no email:
db.users.createIndex( { "email": 1 }, { unique: true } )O índice único permite a inserção de um document sem o campo email se a coleção ainda não contiver um document sem o campo email :
db.users.insertOne( { name: "Arya Stark" } )No entanto, você não pode inserir um segundo document sem o campo email se a coleção já contiver um document sem o campo email. Uma segunda operação que tenta inserir outro document sem o campo email falha ao inserir o document devido à violação da restrição exclusiva no campo email.
Índices únicos parciais
Se você usar a partialFilterExpression e uma restrição exclusiva, a restrição exclusiva se aplicará apenas aos documentos que atendam à expressão de filtro. Para ver um exemplo, consulte Índice parcial com restrição única.
Clusters fragmentados e índices únicos
Uma coleção sharded força uma restrição exclusiva entre shards apenas quando o índice único está na chave de shard com hash ou inclui a chave de shard com hash como um prefixo. Você não pode especificar uma restrição única em um índice com hash.
Para aprender sobre as restrições que se aplicam a índices únicos em coleções fragmentadas e como manter a exclusividade em um campo que não seja sua chave de shard com hash, consulte Manter exclusividade em clusters fragmentados.
Índices únicos esparsos e não esparsos
A partir do MongoDB 5.0, índices esparsos e não esparsos exclusivos com o mesmo padrão de chave podem existir em uma única collection.
Criação de índice único e esparso
Este exemplo cria vários índices com o mesmo padrão de chave e diferentes opções sparse:
db.users.createIndex( { password : 1 }, { name: "unique_index", unique: true } )db.users.createIndex( { password : 1 }, { name: "unique_sparse_index", unique: true, sparse: true } )Criação de índice básico e esparso
Você também pode criar índices básicos com o mesmo padrão de chave com e sem a opção esparsa:
db.users.createIndex( { password : 1 }, { name: "sparse_index", sparse: true } )db.users.createIndex( { password : 1 }, { name: "basic_index" } )Índices básicos e eúnicos com padrões de chave duplicados
Índices básicos e índices únicos podem existir com o mesmo padrão de chave.
Por exemplo, você pode criar os dois índices a seguir que usam o mesmo padrão de chave:
db.users.createIndex( { email : 1 }, { name: "basic_index" } )db.users.createIndex( { email : 1 }, { name: "unique_index", unique: true } )