Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
Click here >
Docs Menu
Docs Home
/
Manual de base de datos
/

Índices encriptados

Los índices encriptados mantienen registros con hash de los valores del campo indexado.

Soporte de índices encriptada particionado usando claves de fragmento cifradas. La partición basada en hash utiliza un índice hash de un campo como la clave de partición para distribuir datos a través de su clúster particionado.

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 admite la creación de índices compuestos que incluyan un solo campo hash. Para crear un índice hash compuesto, especifica hashed como el valor de cualquier clave de índice única 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 índices encriptados, MongoDB 4.2 garantiza que el valor hash para el valor de punto flotante 2 63 en PowerPC sea coherente con otras plataformas.

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

Para listar todos los índices hashed de todas las colecciones en tu implementación, puedes utilizar la siguiente operación en mongosh:

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, ejecuta 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