Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

refineCollectionShardKey (comando de base de datos)

refineCollectionShardKey

Modifica 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.

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.

Nota

El comando tiene la siguiente sintaxis:

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

El comando toma los siguientes campos:

Campo
Tipo
Descripción

string

El espacio de nombres de la colección fragmentada en el "<database>.<collection>" formato.

Documento

El documento que especifica el campo o los campos a utilizar como la nueva clave de partición para la colección.

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

  • La nueva clave debe comenzar con la clave de partición existente.

  • La nueva clave debe estar soportada por un índice que debe existir antes de ejecutar el comando refineCollectionShardKey. Consulta Consideraciones sobre índices para obtener más información.

Para los campos de sufijo, configure los valores de los campos en:

Tip

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.

  • 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 seasimple, 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 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.
  • Intercalación de índices
    Si la colección fragmentada tiene unasimple intercalació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 }.

Para configurar el ejemplo en la base de datos test:

  1. Utiliza la siguiente operación shardCollection para fragmentar la colección orders en la base de datos test. La operación utiliza el campo customer_id como 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 },

  1. Create the index para 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 } )
  2. Ejecute el comando refineCollectionShardKey para agregar el campo order_id como 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.

Para configurar el ejemplo en la base de datos test:

  1. Crea la colección cafés en la base de datos test, especificando la intercalación francesa fr como por defecto.

    db.getSiblingDB("test").createCollection( "cafés", { collation: { locale: "fr" } } );
  2. Fragmenta la colección usando el campo customer_id como la clave de partición inicial. Porque la colección tiene una intercalación por defecto fr y no una intercalación simple, el comando shardCollection debe incluir una opción collation: { 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 },

  1. Create the index para 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ón collation: { locale: "simple" }.

    db.getSiblingDB("test").cafés.createIndex(
    { customer_id: 1, order_id: 1 },
    { collation: { locale: "simple" } }
    )
  2. Ejecute el comando refineCollectionShardKey para agregar el campo order_id como 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.

Volver

Combinar fragmentos

En esta página