Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Chaves de fragmentação

Nesta página

  • Índices de chave de fragmentação
  • Campos de chave de fragmentação ausentes

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.

Diagrama do espaço de valor da chave de fragmentação segmentado em intervalos ou blocos.

A chave do fragmento tem relação direta com a eficácia da distribuição de blocos. Consulte Escolher uma chave de fragmento.

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.

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.

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ó impõem a restrição de exclusividade nos campos _id em todo o cluster quando o campo _id também é a chave de shard.

    Se o campo _id não for a chave de shard ou se for apenas o prefixo da chave de shard, a restrição de exclusividade se aplicará somente ao shard que armazena o documento. Isso significa que dois ou mais documentos podem ter o mesmo valor _id , desde que ocorram em shards diferentes.

    Nos casos em que o campo _id não é a chave de fragmento, o MongoDB espera que as aplicações imponham a exclusividade dos valores de _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.

documento em collection fragmentadas podem não ter os campo da chave de fragmento. Para definir campo de chaves de Shard ausentes, consulte Definir campo de chaves de Shard 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 }

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
← mongos