refineCollectionShardKey
Definição
refineCollectionShardKey
Modifica achave de shard da collection adicionando novos campo 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.
Compatibilidade
Esse comando está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Importante
Este comando não é suportado em M10+ clusters 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
Sintaxe
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">, ... } } )
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 runningrefineCollectionShardKey
.Also, if the current shard index has a unique constraint, then the new shard key cannot specify"hashed"
for any of its fields.See also Sharded Collection and Unique Indexes.
- 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
shardCollection
aorders
collection do notest
reconhecimento de data center do . A operação usa o campocustomer_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 }
,
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 } ) Execute o comando
refineCollectionShardKey
para adicionar o campoorder_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.
Collection comsimple
agrupamento que não seja
Para configurar o exemplo no reconhecimento de data center do test
:
Crie a collection
cafés
no reconhecimento de data centertest
, especificando ofr
francês como o agrupamento padrão.db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); Fragmente a coleta usando o campo
customer_id
como a chave de fragmento inicial. Como a collection tem um agrupamentofr
padrão e não um agrupamentosimple
, o comandoshardCollection
deve 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 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çãocollation: { locale: "simple" }
.db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) Execute o comando
refineCollectionShardKey
para adicionar o campoorder_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.