Chaves de fragmentação
A chave do fragmento é um único campo indexado ou vários campos cobertos por um índice composto que determina a distribuição dos documentos da coleção entre os fragmentos do cluster.
O MongoDB divide a extensão de valores de chaves de fragmentação (ou valores de chaves de fragmentação com hash) em intervalos que não se sobrepõem de valores de chaves de fragmentação (ou valores de chaves de fragmentação com hash). Cada intervalo está associado a um bloco, e o MongoDB tenta distribuir os blocos uniformemente entre os fragmentos no cluster.
A chave do fragmento tem relação direta com a eficácia da distribuição de blocos. Consulte Escolher uma chave de fragmento.
Índices de chave de fragmentação
Todas as collections fragmentadas devem ter um índice compatível com a chave de fragmentação. O índice pode ser um índice na chave de fragmentação ou um índice composto, onde a chave de fragmentação é um prefixo do índice.
Se a collection estiver vazia,
sh.shardCollection()
cria o índice na chave de shard, se esse índice ainda não existir.Se a collection não estiver vazia, é necessário criar o índice antes de usar
sh.shardCollection()
.
Você não pode descartar ou ocultar um índice se ele for o único índice não oculto compatível com a chave de fragmentação.
Unique Indexes
O MongoDB pode impor uma restrição de exclusividade em um índice de chave de fragmentação com intervalo. Por meio do uso de um índice exclusivo na chave de fragmentação, o MongoDB impõe uma exclusividade em toda a combinação da chave, e não em componentes individuais da chave de fragmentação.
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 índice
_id
padrão.Importante
Os clusters fragmentados só forçam a restrição de exclusividade em campos
_id
no cluster quando o campo_id
também é a chave de fragmento.Se o campo
_id
não for a chave de fragmento ou se for apenas o prefixo da 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_id
, desde que ocorram em fragmentos diferentes.Nos casos em que o campo
_id
não é a chave do fragmento, o MongoDB espera que os aplicativos forcem a exclusividade dos valores_id
nos fragmentos.
As restrições de índice único significam que:
Para uma collection que será fragmentada, você não poderá fragmentar a collection se ela tiver outros índices únicos.
Para uma collection já fragmentada, não é possível criar índices únicos em outros campos.
Um índice exclusivo armazena um valor nulo de um documento que não tem o campo indexado; ou seja, um campo com índice não preenchido é tratado como outra instância de um valor
null
para a chave de índice. Para obter mais informações, consulte Campo de documento ausente em um índice exclusivo de campo único.
Para impor singularidade nos valores de chave de fragmentação, passe o parâmetro unique
como true
para o método sh.shardCollection()
:
Se a collection estiver vazia,
sh.shardCollection()
cria o índice exclusivo na chave de fragmentação se tal índice ainda não existir.Se a collection não estiver vazia, é necessário criar o índice antes de usar
sh.shardCollection()
.
Embora possa existir um índice composto exclusivo onde a chave de fragmentação é um prefixo, se você utilizar o parâmetro unique
, a collection deverá ter um índice exclusivo que esteja na chave de fragmentação.
Você não pode especificar uma restrição única em um índice hash.
Para manter a exclusividade em um campo que não é sua chave de shard, consulte Restrições únicas em campos arbitrários.
Campos de chave de fragmentação ausentes
Os documentos em coleções fragmentadas podem não ter os campos-chave fragmentados. Para definir campos de chaves de fragmento ausentes, consulte Definir campos de chaves de fragmento ausentes.
Intervalo de blocos e campos de chave de fragmentação ausentes
Os campos de chave de fragmentação não preenchidos fazem parte do mesmo intervalo de bloco das chaves de fragmentação com valores nulos. Por exemplo, se a chave de fragmentação estiver nos campos { x:
1, y: 1 }
, então:
O documento não tem chave de fragmentação | Faz parte do mesmo intervalo que |
---|---|
{ x: "hello" } | { x: "hello", y: null } |
{ y: "goodbye" } | { x: null, y: "goodbye" } |
{ z: "oops" } | { x: null, y: null } |
Operações de leitura/gravação e campos de chave de fragmentação ausentes
Para segmentar documentos com campos de chave de fragmentação não preenchidos, você pode usar a condição de filtro { $exists: false }
nos campos de chave de fragmentação. Por exemplo, se a chave de fragmentação estiver nos campos { x: 1, y: 1
}
, você pode encontrar os documentos com campos de chave de fragmentação não preenchidos executando a seguinte consulta:
db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
Se você especificar uma condição de filtro de igualdade nula (por exemplo, { x: null
}
), o filtro corresponde tanto aos documentos com campos de chave de shard ausentes quanto àqueles com campos de chave de shard definidos como null
.
Algumas operações de gravação, como uma gravação com uma especificação upsert
, exigem uma correspondência de igualdade na chave de fragmentação. Nesses casos, para segmentar um documento que não tenha a chave de fragmentação, inclua outra condição de filtro além da correspondência de igualdade null
. Por exemplo:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key