La clave de fragmento es una clave indexada única campo o campos múltiples cubiertos por un índice compuesto que determina la distribución de los documentos de la colección entre los fragmentos del clúster.
MongoDB divide el rango de valores de clave de partición (o valores de clave de partición encriptados) en rangos no superpuestos de valores de clave de partición (o valores de clave de partición encriptados). Cada rango está asociado con un fragmento, y MongoDB intenta distribuir los fragmentos uniformemente entre los fragmentos del clúster.
La clave de partición tiene una relación directa con la efectividad de la distribución de fragmentos. Consultar Elegir una clave de partición.
Índices de clave de partición
Las colecciones particionadas suelen requerir un índice que admita la clave de partición. El índice puede ser un índice en la clave de partición o un índice compuesto donde la clave de partición es un prefijo del índice.
Si la colección está vacía,
sh.shardCollection()crea el índice en la clave del fragmento si dicho índice aún no existe.Si la colección no está vacía, primero se debe crear el índice antes de usar
sh.shardCollection().
No se puede descartar ni ocultar un índice si es el único índice no oculto que admite la clave de fragmentación.
A partir de MongoDB 6.0.12 y,5.0.22 puede eliminar el índice de una clave de fragmento con hash. Para más información, consulte Eliminar un índice de clave de fragmento con hash.
Unique Indexes
MongoDB puede aplicar una restricción de unicidad a un índice de clave de fragmento con rango. Mediante el uso de un índice único en la clave de fragmento, MongoDB aplica la unicidad a toda la combinación de claves, no a sus componentes individuales.
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.
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 del fragmento, la restricción de unicidad solo se aplica al fragmento que almacena el documento. Esto significa que dos o más documentos pueden tener el mismo valor _id, siempre que se encuentren en fragmentos 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 donde el campo _id no es la clave del fragmento, MongoDB espera que las aplicaciones apliquen la unicidad de los valores _id en los fragmentos.
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; es decir, un campo de índice que falta se trata como otra instancia de un valor de clave de índice
null. Para más información, consultar Campo de documento faltante en un índice único de un solo campo.
Para aplicar la unicidad en los valores de la clave de fragmentación, pasar el parámetro unique como true al método sh.shardCollection():
Si la colección está vacía,
sh.shardCollection()crea un índice único en la clave de fragmentación si tal índice no existe ya.Si la colección no está vacía, primero se debe crear el índice antes de usar
sh.shardCollection().
Aunque se puede tener un índice compuesto único donde la clave de fragmentación es un prefijo, si se utiliza el parámetro unique, la colección debe tener un índice único que esté en la clave de partición.
No puedes especificar una restricción única en un índice encriptado.
Para mantener la singularidad en un campo que no es la clave de partición, se debe consultar Restricciones de singularidad en campos arbitrarios.
Campos de clave de fragmentación faltantes
Los documentos en colecciones particionadas pueden no tener los campos de clave de partición. Para establecer los campos de clave de partición que faltan, consultar Establecer campos de clave de partición que faltan.
Rango de partición y campos de clave de partición faltantes
Los campos de clave de partición que faltan caen dentro del mismo rango de partición que las claves de partición con valores nulos. Por ejemplo, si la clave de partición está en los campos { x:
1, y: 1 }, entonces:
Documento sin clave de partición | Cae en el mismo rango que |
|---|---|
|
|
|
|
|
|
Operaciones de lectura/guardado y campos de clave de partición faltantes
Para dirigirse a documentos con campos de clave de partición faltantes, se puede utilizar la condición de filtro { $exists: false } en los campos de clave de partición. Por ejemplo, si la clave de partición está en los campos { x: 1, y: 1
}, se pueden encontrar los documentos con campos de clave de partición faltantes ejecutando esta query:
db.shardedcollection.find( { $or: [ { x: { $exists: false } }, { y: { $exists: false } } ] } )
Si especifica una condición de filtro de coincidencia de igualdad nula (por { x: null
} ejemplo,), el filtro coincide tanto aquellos documentos con campos de clave de fragmento faltantes como aquellos con campos de clave de fragmento configurados null en.
Algunas operaciones de escritura, como una escritura con una especificación de upsert, requieren una coincidencia exacta en la clave de fragmentación. En esos casos, para dirigirse a un documento que carece de la clave de fragmentación, incluya otra condición de filtro además de la coincidencia exacta null. Por ejemplo:
{ _id: <value>, <shardkeyfield>: null } // _id of the document missing shard key