Para habilitar el particionado para una colección que ya contiene datos, debes crear un índice que admita la clave de partición. Para habilitar el particionado para una colección vacía, puedes especificar el índice de la clave de partición cuando divide la colección.
Los índices hashed admiten el particionado por hashing, donde los datos se distribuyen entre las particiones en función de los hash de los valores de la clave del shard.
Para crear un índice hash de un solo campo, especifique hashed como el valor de la clave del índice:
db.<collection>.createIndex( { <field>: "hashed" } )
Para crear un índice encriptada que contenga varios campos (un índice compuesto encriptada), especifica hashed como el valor de una clave de índice única. Para otras claves de índice, especifica el orden de clasificación (1 o -1):
db.<collection>.createIndex( { <field1>: "hashed", <field2>: "<sort order>", <field3>: "<sort order>", ... } )
Acerca de esta tarea
La indexación encriptada es ideal para claves de partición con campos que cambian de forma monótona, como las marcas de tiempo o los valores de ObjectId. Cuando usas particionado clasificado por rango con un valor de la clave de partición que aumenta de forma monótona, el fragmento con un límite superior de MaxKey recibe la mayoría de las escrituras entrantes. Este comportamiento restringe las operaciones de inserción a una sola partición, lo que remueve la ventaja de las escrituras distribuidas en un clúster particionado.
Para obtener más información sobre cómo elegir el mejor enfoque de particionado para tu aplicación, consulta Particionado encriptado vs clasificado por rango.
Elige una clave de partición con hash
Tenga en cuenta las siguientes pautas para su clave de fragmento con hash:
El campo que elegiste para tu clave de partición con hash debería tener una alta cardinalidad, lo que significa una gran variedad de valores diferentes.
Si su modelo de datos no contiene un solo campo con alta cardinalidad, considere crear un índice compuesto encriptada. Un índice compuesto encriptado proporciona más valores indexados únicos y puede aumentar la cardinalidad.
La clave de partición debe cubrir los patrones de consulta más comunes. Las consultas de rango (como
$gty$lt) no pueden usar un índice encriptado. Si tu aplicación suele realizar consultas de rango en los campos incluidos en tu clave de partición, considera la partición basada en rango en su lugar.
Un índice encriptada puede contener hasta 32 campos.
Antes de comenzar
Para implementar el particionado mediante hashing, debes implementar un clúster.
Ejemplos
Los siguientes ejemplos le muestran cómo:
Cree un índice encriptada de un solo campo
Considera una colección orders que ya contiene datos. Crea un índice encriptada en la colección orders en el campo _id:
db.orders.createIndex( { _id: "hashed" } )
El campo _id aumenta monótonamente, lo que lo convierte en un buen candidato para una clave indexada por hash. Aunque los valores _id aumentan incrementalmente, cuando MongoDB genera un hash para los valores individuales _id, es poco probable que estos valores hasheados estén en el mismo fragmento.
Después de crear el índice, puedes fragmentar la colección orders:
sh.shardCollection( "<database>.orders", { _id: "hashed" } )
Crear un índice hash compuesto
Considera una colección customers que ya contiene datos. Cree un índice encriptada compuesto en la colección customers sobre los campos name, address y birthday:
db.customers.createIndex( { "name" : 1 "address" : "hashed", "birthday" : -1 } )
Al crear un índice encriptado compuesto, se debe especificar hashed como el valor de una única clave de índice. Para otras claves de índice, especifica el orden de clasificación (1 o -1). En el índice anterior, address es el campo encriptado.
Después de crear el índice, puedes fragmentar la colección customers:
sh.shardCollection( "<database>.customers", { "name" : 1 "address" : "hashed", "birthday" : -1 } )