Menu Docs
Página inicial do Docs
/
Manual 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 _id índice padrão; however, the _id index only enforces the uniqueness constraint per shard if the _id campo is not the shard key.

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 de _id, desde que ocorram em shards 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 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 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 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.

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.

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

Voltar

Roteador (mongos)