Definição
refineCollectionShardKeyModifica a chave de fragmento da coleção adicionando novo(s) campo(s) como sufixo à chave existente. O refinamento da shard key de uma collection pode resolver situações em que a chave existente levou a parte jumbo (ou seja, indivisíveis) devido à cardinalidade insuficiente.
Observação
Distribuição de dados
As part of refining the shard key, the refineCollectionShardKey command updates the chunk ranges and zone ranges to incorporate the new fields without modifying the range values of the existing key fields. That is, the refinement of the shard key does not immediately affect the distribution of chunks across shards or zones. Any future chunk splits or migration occur as part of the routine sharding operations.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
- MongoDB Atlas: The fully managed service for MongoDB deployments in the cloud
Importante
This command is not supported in M10+ clusters. For more information, see Unsupported Commands.
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
Sintaxe
Observação
To use the refineCollectionShardKey command, the sharded cluster must have feature compatibility version (fcv) of 4.4.
O comando tem a seguinte sintaxe:
db.adminCommand( { refineCollectionShardKey: "<database>.<collection>", key: { <existing key specification>, <suffix1>: <1|"hashed">, ... } } )
Campos de comando
O comando utiliza os seguintes campos:
Campo | Tipo | Descrição |
|---|---|---|
string | O namespace da collection fragmentada no formato | |
documento | O documento que especifica o campo ou campos a serem usados como a nova chave de fragmento para a collection.
Para os campos de sufixo, defina os valores do campo como:
|
Controle de acesso
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.
Considerações
Considerações sobre o índice
- 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ão
simple, 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.Além disso, se o índice de fragmento atual tiver uma restrição exclusiva, a nova chave de fragmento não poderá especificar
"hashed"para nenhum de seus campos.Consulte também collection e índice único.
- Agrupamento de Índices
- Se a collection fragmentada tiver um agrupamento padrão não
simple, 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 }.
Exemplos
Para configurar o exemplo no reconhecimento de data center do test :
Utilize a seguinte operação do para fragmentar
shardCollectionaorderscollection do notestreconhecimento de data center do . A operação usa o campocustomer_idcomo 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 },
Create the indexpara dar suporte à nova chave de shard se o índice ainda não existir.db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } ) Run
refineCollectionShardKeycommand to add theorder_idfield as a suffix: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, pode ser que nem todos os documents na coleção tenham os campo de sufixo. Para preencher o(s) campo(s) de chave de fragmento ausente(s), consulte Definir campos de chave de fragmento ausente.
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.
Collection comsimple agrupamento que não seja
Para configurar o exemplo no reconhecimento de data center do test :
Crie a collection
cafésno reconhecimento de data centertest, especificando ofrfrancês como o agrupamento padrão.db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); Fragmente a coleta usando o campo
customer_idcomo a chave de fragmento inicial. Como a collection tem um agrupamentofrpadrão e não um agrupamentosimple, o comandoshardCollectiondeve incluir uma opçãocollation: { 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 },
Create the indexpara 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çãocollation: { locale: "simple" }.db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) Run
refineCollectionShardKeycommand to add theorder_idfield as a suffix: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, pode ser que nem todos os documents na coleção tenham os campo de sufixo. Para preencher o(s) campo(s) de chave de fragmento ausente(s), consulte Definir campos de chave de fragmento ausente.
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.