Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

refineCollectionShardKey

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Campos de comando
  • Controle de acesso
  • Considerações
  • Exemplos
refineCollectionShardKey

Modifica achave de shard da collection adicionando novo(s) campo(s) como um sufixo à chave existente. O refinamento da chave fragmentada de uma coleção pode resolver situações em que a chave existente gerou chunks jumbo (ou seja, indivisíveis) devido à cardinalidade insuficiente.

Observação

Distribuição de dados

Como parte do refinamento da chave de fragmento, o comando refineCollectionShardKey atualiza as faixas de chunks e de zonas para incorporar os novos campos sem modificar os valores de faixa dos campos de chave existentes. Ou seja, o refinamento da chave de fragmento não afeta imediatamente a distribuição de fragmentos entre fragmentos ou zonas. Quaisquer divisões ou migrações futuras de chunks ocorrem como parte das operações de fragmentação de rotina.

Esse comando está disponível em implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

Observação

Este comando não é suportado em clusters M10 ou instâncias sem servidor. Para obter mais informações, consulte Comandos não suportados.

  • MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB

  • MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB

Observação

Para usar o comando refineCollectionShardKey , o cluster fragmentado deve ter a versão de compatibilidade de recursos (fcv) do 4.4.

O comando tem a seguinte sintaxe:

db.adminCommand(
{
refineCollectionShardKey: "<database>.<collection>",
key: { <existing key specification>, <suffix1>: <1|"hashed">, ... }
}
)

O comando utiliza os seguintes campos:

Campo
Tipo
Descrição
string

O namespace da collection fragmentada no formato "<database>.<collection>".

documento

O documento que especifica o campo ou campos a serem usados como a nova chave de fragmento para a collection.

{ <existing key specification>, <suffix1>: <1|"hashed">, ... }

Importante

  • A nova chave deve começar com a chave de fragmento existente.

  • A nova chave deve ser suportada por um índice que deve existir antes de você executar o comando refineCollectionShardKey . Consulte Considerações sobre o índice para obter mais informações.

Para os campos de sufixo, defina os valores do campo como:

Dica

Veja também:

Ao executar com controle de acesso, o usuário deve ter a ação de privilégio do refineCollectionShardKey no reconhecimento de data center e/ou collection para executar o comando. Ou seja, um usuário deve ter uma role que conceda o seguinte privilégio:

{ resource: { db: <database>, collection: <collection> }, actions: [ "refineCollectionShardKey" ] }

O papel do clusterManager embutido fornece os privilégios apropriados.

  • Existência do Índice

    Um índice que suporta a chave especificada do comando deve existir antes de executar o comando.

    Um índice de suporte é um índice que começa com a nova especificação da chave de shard; ou seja, o prefixo do índice corresponde à nova especificação da chave de shard. Ou seja, para alterar a chave de shard de { x: 1, y: 1 } de { x: 1 }, e o índice que começa com { x: 1, y: 1 } deve existir; por exemplo

    • { x: 1, y: 1 }

    • { x: 1, y: 1, a: 1, b: 1}

    Observação

    • O índice de suporte não pode ser um índice parcial.

    • O índice de suporte não pode ser um índice esparso.

    • Se a collection usar um agrupamento nãosimple , o índice de suporte deverá especificar o agrupamento { locale: "simple" } .

  • índice único

    Se o índice de fragmento atual tiver uma restrição de exclusividade, o novo índice da chave de fragmento também deverá ter uma restrição exclusiva.

    After creating the unique index to support the new shard key, drop the old shard key index before running refineCollectionShardKey.
    Also, if the current shard index has a unique constraint, then the new shard key cannot specify "hashed" for any of its fields.
  • Agrupamento de Índices
    Se a collection fragmentada tiver um agrupamento padrão nãosimple , o índice deverá incluir um documento de agrupamento com { locale : "simple" }. Pelo menos um dos índices cujos campos suportam o padrão de chave de fragmento deve ter o agrupamento simples.

Aviso

Não modifique o intervalo ou o tipo de hash de nenhum dos campos de chave de fragmento atuais. Isso causa inconsistências de dados. Por exemplo, não modifique uma chave de fragmento de { customer_id: 1 } para { customer_id: "hashed", order_id: 1 }.

Para configurar o exemplo no reconhecimento de data center do test :

  1. Utilize a seguinte operação do para fragmentar shardCollection a orders collection do no test reconhecimento de data center do . A operação usa o campo customer_id como a chave de fragmento inicial:

    db.adminCommand( { shardCollection: "test.orders", key: { customer_id: 1 } } )

Para modificar a chave de fragmento para ser o campo customer_id e o campo order_id { customer_id: 1, order_id: 1 },

  1. Create the index para dar suporte à nova chave de shard se o índice ainda não existir.

    db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } )
  2. Execute o comando refineCollectionShardKey para adicionar o campo order_id como um sufixo:

    db.adminCommand( {
    refineCollectionShardKey: "test.orders",
    key: { customer_id: 1, order_id: 1 }
    } )

Após a conclusão bem-sucedida do comando, a chave de fragmento da collection foi alterada para { customer_id: 1, order_id: 1 }. Para verificar, você pode executar sh.status().

Dica

Depois de refinar a chave de fragmento, talvez nem todos os documentos da coleção tenham o(s) campo(s) de sufixo. Para preencher o(s) campo(s) de chave de fragmento ausente(s), consulte Campos de chave de fragmento ausentes.

Antes de refinar a chave de fragmento, certifique-se de que todos ou a maioria dos documentos na coleção tenham os campos de sufixo, se possível, para evitar a necessidade de preencher o campo posteriormente.

Para configurar o exemplo no reconhecimento de data center do test :

  1. Crie a collection cafés no reconhecimento de data center test , especificando o fr francês como o agrupamento padrão.

    db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } );
  2. Fragmente a coleta usando o campo customer_id como a chave de fragmento inicial. Como a collection tem um agrupamento fr padrão e não um agrupamento simple , o comando shardCollection deve incluir uma opção collation: { locale: "simple" } :

    db.adminCommand( {
    shardCollection: "test.cafés",
    key: { customer_id: 1 },
    collation: { locale: "simple" }
    } )

Para modificar a chave de fragmento para ser o campo customer_id e o campo order_id { customer_id: 1, order_id: 1 },

  1. Create the index para dar suporte à nova chave de shard, se o índice ainda não existir. Como a collection usa um agrupamento não simples, o índice deve incluir a opção collation: { locale: "simple" } .

    db.getSiblingDB("test").cafés.createIndex(
    { customer_id: 1, order_id: 1 },
    { collation: { locale: "simple" } }
    )
  2. Execute o comando refineCollectionShardKey para adicionar o campo order_id como um sufixo:

    db.adminCommand( {
    refineCollectionShardKey: "test.cafés",
    key: { customer_id: 1, order_id: 1 }
    } )

Após a conclusão bem-sucedida do comando, a chave de fragmento da collection foi alterada para { customer_id: 1, order_id: 1 }. Para verificar, você pode executar sh.status().

Dica

Depois de refinar a chave de fragmento, talvez nem todos os documentos da coleção tenham o(s) campo(s) de sufixo. Para preencher o(s) campo(s) de chave de fragmento ausente(s), consulte Campos de chave de fragmento ausentes.

Antes de refinar a chave de fragmento, certifique-se de que todos ou a maioria dos documentos na coleção tenham os campos de sufixo, se possível, para evitar a necessidade de preencher o campo posteriormente.

Dica

Veja também:

Voltar

mesclarChunks

Próximo

removeShard