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 refinamiento de la clave de fragmento, el refineCollectionShardKey El 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.

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

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">, ... }
}
)

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 que se utilizarán como la nueva clave de fragmento para la colección.

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

  • La nueva clave debe comenzar con la clave de fragmento existente.

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

Para los campos de sufijo, establezca los valores de campo 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.

  • Í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 desimple, 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 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 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 }.

Para configurar el ejemplo en la base de datos test:

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

  1. Create the index para admitir la nueva clave de fragmento si el índice aún no existe.

    db.getSiblingDB("test").orders.createIndex( { customer_id: 1, order_id: 1 } )
  2. refineCollectionShardKey Ejecute el comando para agregar el order_id campo 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.

Para configurar el ejemplo en la base de datos test:

  1. Cree la colección cafés en la base de datos test, especificando francés fr como la intercalación predeterminada.

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

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

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

Volver

Combinar fragmentos

En esta página