Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
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.

Soporte de índices encriptada 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 índice. [1] La función hash colapsa documentos incrustados y calcula el hash para todo el valor pero no admite índices multi-clave (es decir, índices de arreglos). Específicamente, crear un índice hash en un campo que contiene un arreglo o intentar insertar un arreglo en un campo indexado por 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, mongosh ofrece el método convertShardKeyToHashed(). Este método utiliza la misma función de hash que el índice encriptada y puede usarse para ver cuál sería el valor encriptada de una clave.

Para crear un índice encriptada, especifica 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 compuestos con hash requieren que featureCompatibilityVersion esté configurada en 4.4.

La función de hash colapsa los documentos incrustados y calcula el hash del valor completo, pero no es compatible con índices multiclave (es decir, índices de arreglos). En particular, crear un índice hash en un campo que contenga un arreglo o intentar insertar un arreglo en un campo indexado por hash generará 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 encriptada para una clave, consulta convertShardKeyToHashed().

Para los índices hash, MongoDB 4.2 garantiza que el valor 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 valor 2,63.

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), puedes 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

Query un índice Haystack

En esta página