Menu Docs
Página inicial do Docs
/ /

Unique Indexes

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.

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 } )

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 } )

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.

Dica

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.

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éplicas

  • Execute db.collection.createIndex() no mongos para um cluster fragmentado

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" ] } )

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.

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.

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 _id campo 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.

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.

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 } )

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" } )

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 } )

Voltar

Data de validade

Receber um selo de habilidade

Domine os "Fundamentos do design de indexação" gratuitamente!

Saiba mais

Nesta página