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 perfeccionamiento de la clave de partición, el
El comando refineCollectionShardKey actualiza los rangos de fragmentos y los rangos de zona para incorporar los nuevos campos sin modificar los valores de rango de los campos clave existentes. Es decir, el refinamiento de la clave de partición no afecta inmediatamente la distribución de los fragmentos a través de las particiones o zonas. Cualquier futura división de fragmentos o migración ocurre como parte de las operaciones rutinarias de particionado.
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 usar el comando refineCollectionShardKey, el clúster debe tener la compatibilidad de características entre versiones (fcv) de 4.4.
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 a utilizar como la nueva clave de partición para la colección.
Para los campos de sufijo, configure los valores de los campos 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
- Existencia de índice
Debe existir un índice que admita la clave especificada del comando antes de ejecutar el comando.
Un índice auxiliar es aquel que empieza con la nueva especificación de clave de partición; es decir, el prefijo del índice coincide con la nueva especificación de clave de partición. Es decir, para cambiar la clave de partición a
{ x: 1, y: 1 }desde{ x: 1 }, debe existir un índice que comience con{ x: 1, y: 1 }; por ejemplo,{ x: 1, y: 1 }{ x: 1, y: 1, a: 1, b: 1}
Nota
El índice de soporte no puede ser un índice parcial.
El índice de soporte no puede ser un índice disperso.
Si la colección utiliza una intercalación que no sea
simple, el índice de soporte debe especificar la intercalación{ locale: "simple" }.
- índice único
Si el índice de partición actual tiene una restricción de unicidad, el nuevo índice de clave de partición 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 se modifique el rango ni el tipo encriptada de ninguno de los campos clave de partición actuales. Causa inconsistencias de datos. Por ejemplo, no modifique una clave de partición de { customer_id: 1 } a { customer_id:
"hashed", order_id: 1 }.
Ejemplos
Para configurar el ejemplo en la base de datos test:
Utiliza la siguiente operación
shardCollectionpara fragmentar la colecciónordersen la base de datostest. La operación utiliza el campocustomer_idcomo la clave de particióninicial:db.adminCommand( { shardCollection: "test.orders", key: { customer_id: 1 } } )
Para modificar la clave de partición 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 partición si el índice aún no existe.db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } ) Ejecute el comando
refineCollectionShardKeypara agregar el campoorder_idcomo un sufijo:db.adminCommand( { refineCollectionShardKey: "test.orders", key: { customer_id: 1, order_id: 1 } } )
Tras completar correctamente el comando, la clave de partición de la colección ha cambiado a { customer_id: 1, order_id: 1 }. Para comprobarlo, puede ejecutar sh.status().
Tip
Después de refinar la clave de partición, puede que no todos los documentos de la colección tengan el/los campo(s) sufijo(s). Para rellenar los campos de clave de partición faltantes, consulte Campos de clave de partición faltantes.
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 con intercalaciones que no sonsimple
Para configurar el ejemplo en la base de datos test:
Crea la colección
cafésen la base de datostest, especificando la intercalación francesafrcomo por defecto.db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } ); Fragmenta la colección usando el campo
customer_idcomo la clave de partición inicial. Porque la colección tiene una intercalación por defectofry no una intercalaciónsimple, el comandoshardCollectiondebe incluir una opcióncollation: { locale: "simple" }:db.adminCommand( { shardCollection: "test.cafés", key: { customer_id: 1 }, collation: { locale: "simple" } } )
Para modificar la clave de partición para que sea tanto el campo customer_id como el order_id campo { customer_id: 1, order_id: 1 },
Create the indexpara admitir la nueva clave de partición si el índice aún no existe. Debido a que la colección utiliza una intercalación no simple, el índice debe incluir la opcióncollation: { locale: "simple" }.db.getSiblingDB("test").cafés.createIndex( { customer_id: 1, order_id: 1 }, { collation: { locale: "simple" } } ) Ejecute el comando
refineCollectionShardKeypara agregar el campoorder_idcomo un sufijo:db.adminCommand( { refineCollectionShardKey: "test.cafés", key: { customer_id: 1, order_id: 1 } } )
Tras completar correctamente el comando, la clave de partición de la colección ha cambiado a { customer_id: 1, order_id: 1 }. Para comprobarlo, puede ejecutar sh.status().
Tip
Después de refinar la clave de partición, puede que no todos los documentos de la colección tengan el/los campo(s) sufijo(s). Para rellenar los campos de clave de partición faltantes, consulte Campos de clave de partición faltantes.
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.