Normalmente, MongoDB divide un fragmento después de una inserción si el fragmento supera el tamaño máximo del fragmento. Sin embargo, tal vez quieras dividir los fragmentos manualmente si:
tienes una gran cantidad de datos en tu clúster y muy pocos fragmentos, como es el caso después de desplegar un clúster utilizando datos existentes.
se espera agregar una gran cantidad de datos que inicialmente residirían en un único fragmento o partición. Por ejemplo, planeas insertar una gran cantidad de datos con valores de la clave de partición entre
300y400, pero todos los valores de tus claves de fragmento están entre250y500en un solo fragmento.
Nota
MongoDB proporciona el comando mergeChunks para combinar rangos de fragmentos contiguos en un único fragmento. Consulta Unir fragmentos en un clúster fragmentado para obtener más información.
El balanceador puede migrar a un nuevo fragmento los segmentos recientemente divididos de inmediato si el movimiento beneficia futuras inserciones. El balanceador no distingue entre fragmentos divididos manualmente y aquellos divididos automáticamente por el sistema.
Advertencia
Ten cuidado al dividir los datos en una colección particionada para crear nuevos fragmentos. Cuando particionas una colección que tiene datos existentes, MongoDB crea automáticamente fragmentos para distribuir equitativamente la colección. Para dividir datos de manera efectiva en un clúster de particiones, debes considerar el número de documentos en un fragmento y el tamaño promedio de los documentos para crear un tamaño de fragmento uniforme. Cuando los fragmentos tienen tamaños irregulares, las particiones pueden tener el mismo número de fragmentos, pero con tamaños de datos muy diferentes. Evite crear divisiones que conduzcan a una colección con fragmentos de tamaños diferentes.
Use sh.status() para determinar los rangos de fragmentos actuales en el clúster.
Para dividir fragmentos manualmente, utilice el comando split con los campos middle o find. mongosh proporciona los métodos asistentes sh.splitFind() y sh.splitAt().
splitFind() divide el fragmento que contiene el primer documento devuelto que coincide con esta consulta en dos fragmentos de igual tamaño. Se debe especificar el espacio de nombres completo (es decir. "<database>.<collection>") de la colección particionada a splitFind(). La consulta en splitFind() no necesita utilizar la clave de partición, aunque casi siempre tiene sentido hacerlo.
Ejemplo
El siguiente comando divide el fragmento que contiene el valor de 63109 para el campo zipcode en la colección people de la base de datos records:
sh.splitFind( "records.people", { "zipcode": "63109" } )
Utilice splitAt() para dividir un fragmento en dos, empleando el documento consultado como límite inferior en el nuevo fragmento:
Ejemplo
El siguiente comando divide el fragmento que contiene el valor de 63109 para el campo zipcode en la colección people de la base de datos records.
sh.splitAt( "records.people", { "zipcode": "63109" } )
Nota
splitAt() no necesariamente divide el fragmento en dos fragmentos de igual tamaño. La división ocurre en la ubicación del documento que coincide con la query, independientemente de dónde se encuentre ese documento en el fragmento.