Docs Menu
Docs Home
/
Manual de base de datos
/

Índices encriptados

Los índices con hash mantienen entradas con hashes de los valores del campo indexado.

Compatibilidad con índices hash Fragmentación mediante claves de fragmento con hash. Lafragmentación basada en hash utiliza el índice con hash de un campo como clave de fragmento para particionar los datos en el clúster fragmentado.

Usar una clave de partición con hash para particionar una colección resulta en una distribución más uniforme de datos. Consulte Hashed Sharding para más detalles.

Los índices hash utilizan una función hash para calcular el hash del valor del campo de índice. []1 La función hash contrae los documentos incrustados y calcula el hash de todo el valor, pero no admite índices multiclave (es decir, matrices). En concreto, crear un índice hash en un campo que contiene una matriz o intentar insertar una matriz en un campo indexado con hash devuelve un error.

Tip

MongoDB calcula automáticamente los hashes al resolver los query utilizando índices encriptados. Las aplicaciones no necesitan calcular hashes.

[1] A partir de la versión 4.0, mongoshproporciona el métodoconvertShardKeyToHashed(). Este método utiliza la misma función hash que el índice hash y permite determinar cuál sería el valor hash de una clave.

Para crear un índice hash, especifique hashed como el valor de la clave del índice, como en el siguiente ejemplo:

db.collection.createIndex( { _id: "hashed" } )

Nuevo en la versión 4.4.

A partir de MongoDB 4.4, MongoDB permite la creación de índices compuestos que incluyen un único campo hash. Para crear un índice compuesto hash, especifique hashed como valor de cualquier clave de índice al crear el índice:

db.collection.createIndex( { "fieldA" : 1, "fieldB" : "hashed", "fieldC" : -1 } )

Los índices hash compuestos requieren que featureCompatibilityVersion esté establecido 4.4 en.

La función hash contrae los documentos incrustados y calcula el hash de todo el valor, pero no admite índices multiclave (es decir, matrices). En concreto, crear un índice hash en un campo que contiene una matriz o intentar insertar una matriz en un campo indexado con hash devuelve un error.

MongoDB no admite especificar una restricción única en un índice hashed. En su lugar, puedes crear un índice adicional no encriptada con la restricción única en ese campo. MongoDB puede utilizar ese índice no hash para aplicar la unicidad en el campo.

Advertencia

Los índices de MongoDB hashed truncan los números de punto flotante a enteros de 64 bits antes del hashing. Por ejemplo, un índice hashed almacenaría el mismo valor para un campo que tuviera un valor de 2.3, 2.2 y 2.9. Para evitar colisiones, no uses un índice hashed para números flotantes que no puedan convertirse de manera fiable a enteros de 64 bits (y luego volver a números flotantes). Los índices de MongoDB hashed no admiten valores de coma flotante superiores a 2 53.

Para ver cuál sería el valor hash de una clave,convertShardKeyToHashed() consulte.

Para los índices con hash, MongoDB 4.2 garantiza que el valor con hash para el valor de punto flotante 2 63 en PowerPC sea consistente con otras plataformas.

Aunque los índices hash en un campo que puede contener valores de punto flotante mayores que 2 53 es una configuración no compatible, los clientes aún pueden insertar documentos donde el campo indexado tenga el 2 63 valor.

Para enumerar todos los hashed índices de todas las colecciones en su implementación, puede utilizar la siguiente operación mongosh en:

db.adminCommand("listDatabases").databases.forEach(function(d){
let mdb = db.getSiblingDB(d.name);
mdb.getCollectionInfos({ type: "collection" }).forEach(function(c){
let currentCollection = mdb.getCollection(c.name);
currentCollection.getIndexes().forEach(function(idx){
let idxValues = Object.values(Object.assign({}, idx.key));
if (idxValues.includes("hashed")) {
print("Hashed index: " + idx.name + " on " + d.name + "." + c.name);
printjson(idx);
};
});
});
});

Para comprobar si el campo indexado contiene el valor,2 63 ejecute la siguiente operación para la colección y el campo indexado:

  • Si el tipo de campo indexado es un escalar y nunca un documento:

    // substitute the actual collection name for <collection>
    // substitute the actual indexed field name for <indexfield>
    db.<collection>.find( { <indexfield>: Math.pow(2,63) } );
  • Si el tipo de campo indexado es un documento (o un escalar), puede ejecutar:

    // substitute the actual collection name for <collection>
    // substitute the actual indexed field name for <indexfield>
    db.<collection>.find({
    $where: function() {
    function findVal(obj, val) {
    if (obj === val)
    return true;
    for (const child in obj) {
    if (findVal(obj[child], val)) {
    return true;
    }
    }
    return false;
    }
    return findVal(this.<indexfield>, Math.pow(2, 63));
    }
    })

Volver

Consultar un índice de Haystack

En esta página