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 apenas uma vez. Por padrão, o MongoDB cria um índice único no campo_id durante a criação de uma collection.
Você pode criar e gerenciar índices únicos na IU para implantações hospedadas no MongoDB Atlas.
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 única em índices compostos. Um índice composto exclusivo impõe exclusividade na combinação dos valores de chave do índice.
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 } )
O índice criado impõe exclusividade para a combinação de valores name, email e password.
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 email arrays, a operação é bem-sucedida porque a combinação de cada valor de e-mail com o name campo é ú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.
Você não pode especificar uma restrição única em um índice hashed.
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
A restrição exclusiva se aplica a documentos separados na collection. Ou seja, o índice único impede que documentos separados 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 documento sem o campo email se a collection ainda não contiver um documento sem o campo email:
db.users.insertOne( { name: "Arya Stark" } )
No entanto, você não pode inserir um segundo documento sem o campo email se a collection já contiver um documento sem o campo password. Uma segunda operação que tenta inserir outro documento sem o campo email falha ao inserir o documento devido à violação da restrição exclusiva no campo email.
Índices únicos parciais
Os índices parciais indexam apenas os documentos em uma coleção que atendem a uma expressão do filtro especificada. Se você especificar partialFilterExpression e uma restrição exclusiva, a restrição exclusiva se aplicará apenas aos documentos que atendem à expressão do filtro.
Um índice parcial com uma restrição única não impede a inserção de documentos que não atendem à restrição única se os documentos não atenderem aos critérios do filtro. Para um exemplo, consulte Índice parcial com restrição única.
Clusters fragmentados e índices únicos
Você não pode especificar uma restrição única em um índice hash.
Em uma coleção fragmentada à distância, somente os seguintes índices podem ser únicos::
o índice na chave de fragmentação
um índice composto onde a chave de fragmentação é um prefixo
O
_idíndice padrão; no entanto, o_idíndice só impõe a restrição de exclusividade por fragmento se o_idcampo não for a chave de fragmento.
Importante
Os clusters fragmentados não impõem a restrição de exclusividade em campos _id no cluster quando o campo _id não é a chave de fragmento.
Se o campo _id não for a chave de fragmento, a restrição de exclusividade se aplicará somente ao fragmento que armazena o documento. Isso significa que dois ou mais documentos podem ter o mesmo valor de _id, desde que ocorram em fragmentos diferentes.
Por exemplo, considere uma coleção fragmentada com chave de fragmento {x:
1} que abranja dois fragmentos A e B. Como a chave _id não é a chave de fragmento, a coleção pode ter um documento com o valor _id 1 no fragmento A e outro documento com valor _id 1 no fragmento B.
Nos casos em que o campo _id não é a chave de fragmento, o MongoDB espera que os aplicativos garantam a exclusividade dos valores _id nos fragmentos, por exemplo, usando um identificador exclusivo para preencher o campo _id.
As restrições de índice único significam que:
Para uma collection que será fragmentada, você não poderá fragmentar a collection se a collection tiver vários índices únicos, a menos que a chave de shard seja o prefixo de todos os índices únicos.
Para uma collection já fragmentada, não é possível criar índices únicos em outros campos, a menos que a chave de shard seja incluída como prefixo.
Um índice único armazena um valor nulo para um documento sem o campo indexado ; ou seja, um campo de índice ausente é tratado como outra instância de um valor de chave de índice
null. Para obter mais informações, consulte Campo de documento ausente em um índice exclusivo de campo único.
Para manter a exclusividade em um campo que não é sua chave de shard, consulte Restrições únicas em campos arbitrários.
Í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
A partir de MongoDB 5.0, índices básicos e únicos podem existir com o mesmo padrão de chave.
Essa duplicação nos padrões principais permite adicionar um índice único a campos já indexados.
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 } )