Um cluster fragmentado impõe uma restrição exclusiva entre shards somente quando o índice único está na chave de shard ou inclui a chave de shard como um prefixo. Esta página descreve como manter a exclusividade ao fragmentar uma coleção.
Para criar um índice único em uma collection que já esteja fragmentada, consulte Criar um índice exclusivo em uma collection fragmentada existente. Para impor exclusividade nos valores de chave de fragmento, consulte Impor exclusividade nos valores de chave de fragmento. Para impor a exclusividade em um campo que não pode fazer parte da chave de shard, consulte Impor exclusividade em um campo que não seja a chave de shard.
Para refragmentar uma collection que tenha uma restrição de exclusividade, a nova chave de shard deve satisfazer os requisitos de índice único para quaisquer índices únicos existentes. Para obter detalhes, consulte Refragmentar uma collection.
Sobre esta tarefa
Um índice único garante que os campos indexados não armazenem valores duplicados. Em uma coleção fragmentada, cada fragmento só pode verificar seus próprios dados em busca de duplicatas, para que o MongoDB possa impor a restrição em todo o cluster somente quando cada documento com um determinado valor de chave de índice tiver a garantia de permanecer no mesmo fragmento. A inclusão da chave de shard como prefixo do índice fornece essa garantia.
Para uma coleção fragmentada variada, somente os seguintes índices podem ser exclusivos:
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.
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. Um campo de índice ausente é tratado como outra instância de um valor de chave de índice
null. Para obter detalhes, consulte Campo de documento ausente em um índice exclusivo de campo único.
As seguintes restrições também se aplicam:
Você não pode especificar uma restrição única em um índice hash.
Se houver um agrupamento na chave de índice, o MongoDB só poderá garantir a exclusividade se o agrupamento for simples.
Um índice único na chave de fragmentação impõe exclusividade em toda a combinação da chave, não nos componentes individuais da chave de fragmentação.
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.
Antes de começar
Identifique a chave fragmentada da coleção. Para visualizar a chave de fragmento de uma coleção fragmentada, execute o método
sh.status()e localize a coleção no resultado.Confirme se nenhum documento existente viola a restrição de exclusividade para o campo. Se um shard contiver documentos com valores duplicados, a operação de criação de índice poderá ser bem-sucedida nos shards sem duplicatas, mas falhará no shard com duplicatas, deixando índices inconsistentes entre os shards.
Conecte o
mongosha uma instância domongos.
Passos
O exemplo a seguir fragmenta a coleção accounts.names em region_id e impõe uma restrição exclusiva à combinação de region_id e email.
Fragmentar a coleção.
Para fragmentar a coleção, execute o método sh.shardCollection():
sh.shardCollection( "accounts.names", { region_id: 1 } )
{ collectionsharded: 'accounts.names', ok: 1, '$clusterTime': { clusterTime: Timestamp( { t: 1759260515, i: 58 } ), signature: { hash: Binary.createFromBase64( 'AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0 ), keyId: Long( '0' ) } }, operationTime: Timestamp( { t: 1759260515, i: 57 } ) }
Se você fragmentar uma collection que contenha um índice único que não inclua a chave de shard como prefixo, o MongoDB retornará um erro ao executar o comandoshardCollection.