Un clúster fragmentado impone una restricción de unicidad entre fragmentos solo cuando el índice único se encuentra en la clave del fragmento o la incluye como prefijo. Esta página describe cómo mantener la unicidad al fragmentar una colección.
Para crear un índice único en una colección que ya está fragmentada, consulte Crear un índice único en una colección fragmentada existente. Para garantizar la unicidad de los valores de la clave de fragmentación, consulte Garantizar la unicidad de los valores de la clave de fragmentación. Para garantizar la unicidad de un campo que no puede formar parte de la clave de fragmentación, consulte Garantizar la unicidad de un campo que no es la clave de fragmentación.
Para refragmentar una colección con una restricción de unicidad, la nueva clave de fragmentación debe cumplir los requisitos de índice único para cualquier índice único existente. Para obtener más información, consulte Refragmentar una colección.
Acerca de esta tarea
Un índice único garantiza que los campos indexados no almacenen valores duplicados. En una colección fragmentada, cada fragmento solo puede verificar sus propios datos en busca de duplicados, por lo que MongoDB solo puede aplicar la restricción en todo el clúster cuando se garantiza que cada documento con un valor de clave de índice determinado reside en el mismo fragmento. Incluir la clave del fragmento como prefijo del índice proporciona dicha garantía.
Para una colección particionada clasificada por rango, solo los siguientes índices pueden ser únicos:
El índice en la clave de fragmentación
Un índice compuesto donde la clave de partición es un prefijo
El índice
_idpor defecto; sin embargo, el índice_idsolo aplica la restricción de unicidad por fragmento si el campo_idno es la clave de fragmentación.
Las restricciones de índices únicos implican que:
Para una colección particionada, no puede fragmentarse la colección si tiene varios índices únicos, a menos que la clave de partición sea el prefijo de todos los índices únicos.
Para una colección ya particionada, no puedes crear índices únicos en otros campos a menos que la clave de partición se incluya como prefijo.
Un índice único almacena un valor nulo para un documento al que le falta el campo indexado. Un campo de índice faltante se trata como otra instancia de un valor de clave de índice
null. Para obtener más detalles, consulte Campo de documento faltante en un índice único de un solo campo.
También se aplican las siguientes restricciones:
No puedes especificar una restricción única en un índice encriptado.
Si existe una intercalación en la clave del índice, MongoDB solo puede garantizar la unicidad si la intercalación es simple.
Un índice único en la clave de fragmentación garantiza la unicidad de toda la combinación de claves, no de los componentes individuales de la clave de fragmentación.
Importante
Los clústeres particionados no aplican la restricción de unicidad en los campos _id en todo el clúster cuando el campo _id no es la clave de partición.
Si el campo _id no es la clave de partición, la restricción de unicidad solo se aplica a la partición que almacena el documento. Esto significa que dos o más documentos pueden tener el mismo valor _id, siempre que se encuentren en particiones diferentes.
Por ejemplo, una colección particionada con la clave de partición {x: 1} que se extiende por dos particiones A y B. Dado que la clave _id no es la clave de partición, la colección podría tener un documento con el valor _id 1 en la partición A y otro documento con el valor _id 1 en el partición B.
En los casos en que el campo _id no sea la clave de partición, MongoDB espera que las aplicaciones garanticen la unicidad de los valores de _id entre las particiones, por ejemplo, utilizando un identificador único para completar el campo _id.
Antes de comenzar
Identifique la clave de fragmentación de la colección. Para ver la clave de fragmentación de una colección fragmentada, ejecute el método
sh.status()y localice la colección en la salida.Confirme que ningún documento existente infringe la restricción de unicidad del campo. Si una partición contiene documentos con valores duplicados, la operación de creación de índice puede tener éxito en las particiones sin duplicados, pero fallar en la partición con duplicados, lo que deja índices inconsistentes en todas las particiones.
Conectar
mongosha una instancia demongos.
Pasos
El siguiente ejemplo divide la colección accounts.names en region_id y aplica una restricción única a la combinación de region_id y email.
Divida la colección en partición.
Para fragmentar la colección, ejecute el método sh.shardCollection():
sh.shardCollection( "accounts.names", { region_id: 1 } )
{ collectionsharded: 'accounts.names', ok: 1, '$clusterTime': { clusterTime: Timestamp( { t: 1759260515, i: 58 } ), signature: { hash: Binary.createFromBase64( 'AAAAAAAAAAAAAAAAAAAAAAAAAAA=', 0 ), keyId: Long( '0' ) } }, operationTime: Timestamp( { t: 1759260515, i: 57 } ) }
Si divides una colección que contiene un índice único que no incluye la clave de división como prefijo, MongoDB devuelve un error cuando ejecutas el comandoshardCollection.