Definición
refineCollectionShardKeyModifica la colección Clave de fragmento añadiendo nuevos campos como sufijo a la clave existente. Refinar la clave de fragmento de una colección puede solucionar situaciones en las que la clave existente ha generado fragmentos gigantes (es decir, indivisibles) debido a una cardinalidad insuficiente.
Nota
Distribución de datos
Como parte del refinamiento de la clave de fragmento, el refineCollectionShardKey comando actualiza los rangos de fragmentos y zonas para incorporar los nuevos campos sin modificar los valores de rango de los campos de clave existentes. Es decir, el refinamiento de la clave de fragmento no afecta inmediatamente la distribución de fragmentos entre fragmentos o zonas. Cualquier división o migración de fragmentos futura se realiza como parte de las operaciones rutinarias de fragmentación.
Compatibilidad
Este comando está disponible en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
Importante
Este comando no está soportado en los clústeres M10+. Para más información, consulta Comandos no soportados.
MongoDB Enterprise: La versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: La versión de MongoDB con código fuente disponible, de uso gratuito y autogestionada.
Sintaxis
Nota
Para utilizar el refineCollectionShardKey comando, el clúster fragmentado debe tener la versión de compatibilidad de características (fcv) 4.4de.
El comando tiene la siguiente sintaxis:
db.adminCommand( { refineCollectionShardKey: "<database>.<collection>", key: { <existing key specification>, <suffix1>: <1|"hashed">, ... } } )
Campos de comandos
El comando toma los siguientes campos:
Campo | Tipo | Descripción |
|---|---|---|
string | El espacio de nombres de la colección fragmentada en el | |
Documento | El documento que especifica el campo o los campos que se utilizarán como la nueva clave de fragmento para la colección.
Para los campos de sufijo, establezca los valores de campo en:
|
Control de acceso
Al ejecutar con control de acceso, el usuario debe tener el privilegio refineCollectionShardKey para ejecutar el comando en la base de datos o la colección. Es decir, debe tener un rol que otorgue el siguiente privilegio:
{ resource: { db: <database>, collection: <collection> }, actions: [ "refineCollectionShardKey" ] }
El rol clusterManager incorporado proporciona los privilegios apropiados.
Considerations
Consideraciones sobre los índices
- Índice Existencia
Debe existir un índice que admita la clave especificada del comando antes de ejecutar el comando.
Un índice de soporte es un índice que comienza con la nueva especificación de clave de fragmento; es decir, el prefijo del índice coincide con la nueva especificación de clave de fragmento. Es decir, para cambiar la clave de fragmento de
{ x: 1, y: 1 }a, debe existir un índice que comience{ x: 1 }{ x: 1, y: 1 }con; por ejemplo:{ x: 1, y: 1 }{ x: 1, y: 1, a: 1, b: 1}
Nota
El índice de apoyo no puede ser un índice parcial.
El índice de soporte no puede ser un índice disperso.
Si la colección utiliza una intercalación distinta de
simple, el índice de soporte debe especificar la intercalación{ locale: "simple" }.
- Índice único
Si el índice de fragmento actual tiene una restricción de unicidad, el nuevo índice de clave de fragmento también debe tener una restricción única.
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.
- Intercalación de índices
- Si la colección fragmentada tiene una
simpleintercalación predeterminada distinta de, el índice debe incluir un documento de intercalación{ locale : "simple" }con. Al menos uno de los índices cuyos campos admitan el patrón de clave de fragmentación debe tener la intercalación simple.
Advertencia
No modifique el rango ni el tipo de hash de ninguno de los campos de la clave de fragmento actual. Esto causa inconsistencias en los datos. Por ejemplo, no modifique una clave de fragmento de { customer_id: 1 } a { customer_id:
"hashed", order_id: 1 }.
Ejemplos
Para configurar el ejemplo en la base de datos test:
Utilice la siguiente operación para fragmentar
shardCollectionlaorderscolección en latestbase de datos. La operación utiliza elcustomer_idcampo como clave de fragmentación inicial:db.adminCommand( { shardCollection: "test.orders", key: { customer_id: 1 } } )
Para modificar la clave del fragmento para que sea el campo customer_id y el campo order_id { customer_id: 1, order_id: 1 },
Create the indexpara admitir la nueva clave de fragmento si el índice aún no existe.db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } ) refineCollectionShardKeyEjecute el comando para agregar elorder_idcampo como sufijo:db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
Al completar el comando correctamente, la clave de fragmento de la colección cambia { customer_id: 1, order_id: 1 } a. Para verificarlo, puede sh.status() ejecutar.
Tip
Después de refinar la clave de fragmento, es posible que no todos los documentos de la colección tengan los campos de sufijo. Para completar los campos de clave de fragmento que faltan, consulte Campos de clave de fragmento que faltan.
Antes de refinar la clave de fragmento, asegúrese de que todos o la mayoría de los documentos de la colección tengan los campos de sufijo, si es posible, para evitar tener que completar el campo posteriormente.
Colección consimple intercalaciónno
Para configurar el ejemplo en la base de datos test:
Cree la
caféscolección en latestbase de datos, especificando francésfrcomo la intercalación predeterminada.db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); Participe la colección usando
customer_idel campo como clave de partición inicial. Dado que la colección tiene unafrintercalación predeterminada ysimpleno, el comando debe incluirshardCollectionunacollation: { locale: "simple" }opción:db.adminCommand( { shardCollection: "test.cafés", key: { customer_id: 1 }, collation: { locale: "simple" } } )
Para modificar la clave de fragmento para que sea tanto el campo customer_id como el campo order_id { customer_id: 1, order_id: 1 },
Create the indexpara admitir la nueva clave de fragmento si el índice aún no existe. Dado que la colección utiliza una intercalación no simple, el índice debe incluir lacollation: { locale: "simple" }opción.db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) refineCollectionShardKeyEjecute el comando para agregar elorder_idcampo como sufijo:db.adminCommand( { refineCollectionShardKey: "test.cafés", key: { customer_id: 1, order_id: 1 } } )
Al completar el comando correctamente, la clave de fragmento de la colección cambia { customer_id: 1, order_id: 1 } a. Para verificarlo, puede sh.status() ejecutar.
Tip
Después de refinar la clave de fragmento, es posible que no todos los documentos de la colección tengan los campos de sufijo. Para completar los campos de clave de fragmento que faltan, consulte Campos de clave de fragmento que faltan.
Antes de refinar la clave de fragmento, asegúrese de que todos o la mayoría de los documentos de la colección tengan los campos de sufijo, si es posible, para evitar tener que completar el campo posteriormente.