Overview
Esta guía le muestra cómo utilizar una aplicación habilitada para cifrado consultable para recuperar un documento que tiene campos cifrados.
Después de completar los pasos de esta guía, debería poder usar su aplicación para consultar datos en campos cifrados y descifrar esos campos como usuario autorizado.
Antes de empezar
Cree una colección cifrada e inserte documentos antes de continuar.
Procedimiento
Consultar un campo cifrado con igualdad
Si habilitó las consultas de igualdad en un campo cifrado, puede recuperar documentos que tengan un valor específico en ese campo.
El siguiente ejemplo realiza una consulta de igualdad en un campo cifrado e imprime los datos descifrados:
const findResult = await encryptedCollection.findOne({ "patientRecord.ssn": "987-65-4320", }); console.log(findResult);
var ssnFilter = Builders<Patient>.Filter.Eq("patientRecord.ssn", patient.PatientRecord.Ssn); var findResult = await encryptedCollection.Find(ssnFilter).ToCursorAsync(); Console.WriteLine(findResult.FirstOrDefault().ToJson());
var findResult PatientDocument err = coll.FindOne( context.TODO(), bson.M{"patientRecord.ssn": "987-65-4320"}, ).Decode(&findResult)
Patient findResult = collection.find( new BsonDocument() .append("patientRecord.ssn", new BsonString("987-65-4320"))) .first(); System.out.println(findResult);
const findResult = await encryptedCollection.findOne({ "patientRecord.ssn": "987-65-4320", }); console.log(findResult);
$findResult = $encryptedCollection->findOne([ 'patientRecord.ssn' => '987-65-4320', ]); print_r($findResult);
find_result = encrypted_collection.find_one({ "patientRecord.ssn": "987-65-4320" }) print(find_result)
let find_result = encrypted_coll.find_one(doc! {"patientRecord.ssn": "987-65-4320"}).await?; match find_result { Some(document) => println!("{:?}", document), None => println!("Document not found"), }
Consultar un campo cifrado con rango
Si habilitó las consultas de rango en un campo cifrado, puede recuperar documentos donde el valor de ese campo esté dentro del rango que especifique.
El siguiente ejemplo realiza una query de rango en un campo cifrado e imprime los datos descifrados:
const findResult = await encryptedCollection.findOne({ "patientRecord.billAmount": { $gt: 1000, $lt: 2000 }, }); console.log(findResult);
var filter = Builders<Patient>.Filter.Gt("patientRecord.billAmount", 1000) & Builders<Patient>.Filter.Lt("patientRecord.billAmount", 2000); var findResult = encryptedCollection.Find(filter).FirstOrDefault(); Console.WriteLine(findResult.ToJson());
filter := bson.D{ {"patientRecord.billAmount", bson.D{ {"$gt", 1000}, {"$lt", 2000}, }}, } var findResult PatientDocument err = coll.FindOne(context.TODO(), filter).Decode(&findResult) if err != nil { log.Fatal(err) } if err != nil { fmt.Print("Unable to find the document\n") } else { output, _ := json.MarshalIndent(findResult, "", " ") fmt.Printf("%s\n", output) }
Document filter = new Document("patientRecord.billAmount", new Document("$gt", 1000).append("$lt", 2000)); Patient findResult = collection.find(filter).first(); System.out.println(findResult);
const findResult = await encryptedCollection.findOne({ "patientRecord.billAmount": { $gt: 1000, $lt: 2000 }, }); console.log(findResult);
$findResult = $encryptedCollection->findOne([ 'patientRecord.billAmount' => ['$gt' => 1000, '$lt' => 2000], ]); print_r($findResult);
query = {"patientRecord.billAmount": {"$gt": 1000, "$lt": 2000}} find_result = encrypted_collection.find_one(query) print(find_result)
let query = doc! { "$and": [ doc! { "patientRecord.billAmount": doc! { "$gt": 1000 } }, doc! { "patientRecord.billAmount": doc! { "$lt": 2000 } } ] }; let find_result = encrypted_coll.find_one(query).await?; match find_result { Some(document) => println!("{:?}", document), None => println!("Document not found"), }
Consultar un campo cifrado para una coincidencia de prefijo, sufijo o subcadena
Si habilitó las consultas de prefijo, sufijo o subcadena en un campo cifrado, puede recuperar documentos donde el valor de ese campo incluya la cadena especificada en sus criterios de búsqueda.
El siguiente ejemplo realiza una consulta de prefijo en un campo cifrado e imprime los datos descifrados:
var filter = new BsonDocument("$expr", new BsonDocument("$encStrStartsWith", new BsonDocument { { "input", "$patientRecord.ssn" }, { "prefix", "987" } })); var findResult = await encryptedCollection.Find(filter).ToCursorAsync(); Console.WriteLine(findResult.FirstOrDefault().ToJson());
Para realizar una consulta de sufijo, reemplace $encStrStartsWith
con $encStrEndsWith. Luego, reemplace la opción prefix con la opción suffix.
Para realizar una consulta de subcadena, utilice el operador $encStrContains, como se muestra en el siguiente ejemplo:
var filter = new BsonDocument("$expr", new BsonDocument("$encStrContains", new BsonDocument { { "input", "$patientRecord.ssn" }, { "substring", "-65-432" } })); var findResult = await encryptedCollection.Find(filter).ToCursorAsync(); Console.WriteLine(findResult.FirstOrDefault().ToJson());
Document filter = new Document("$expr", new Document("$encStrStartsWith", new Document() .append("input", "$patientRecord.ssn") .append("prefix", "987"))); Patient findResult = collection.find(filter).first(); System.out.println(findResult);
Para realizar una consulta de sufijo, sustituya $encStrStartsWith por $encStrEndsWith. Luego, sustituya la opción prefix por suffix.
Para realizar una consulta de subcadena, utilice el operador $encStrContains, como se muestra en el siguiente ejemplo:
Document filter = new Document("$expr", new Document("$encStrContains", new Document() .append("input", "$patientRecord.ssn") .append("substring", "-65-432"))); Patient findResult = collection.find(filter).first(); System.out.println(findResult);
const findResult = await encryptedCollection.findOne( { $expr: { $encStrStartsWith: { input: "$patientRecord.ssn", prefix: "987" } } })
Para realizar una consulta de sufijo, sustituya $encStrStartsWith por $encStrEndsWith. Luego, sustituya la opción prefix por suffix.
Para realizar una consulta de subcadena, utilice el operador $encStrContains, como se muestra en el siguiente ejemplo:
const findResult = await encryptedCollection.findOne( { $expr: { $encStrContains: { input: "$patientRecord.ssn", substring: "-65-432" } } })
find_result = encrypted_collection.find_one( { "$expr": { "$encStrStartsWith": { "input": "$patientRecord.ssn", "prefix": "987" } } })
Para realizar una consulta de sufijo, sustituya $encStrStartsWith por $encStrEndsWith. Luego, sustituya la opción prefix por suffix.
Para realizar una consulta de subcadena, utilice el operador $encStrContains, como se muestra en el siguiente ejemplo:
find_result = encrypted_collection.find_one( { "$expr": { "$encStrContains": { "input": "$patientRecord.ssn", "substring": "-65-432" } } })
Resultado de la consulta
La salida de los ejemplos de código anteriores debería verse similar a la siguiente:
{ "_id": { "$oid": "648b384a722cb9b8392df76a" }, "name": "Jon Doe", "record": { "ssn": "987-65-4320", "billing": { "type": "Visa", "number": "4111111111111111" }, "billAmount": 1500 }, "__safeContent__": [ { "$binary": { "base64": "L1NsYItk0Sg+oL66DBj6IYHbX7tveANQyrU2cvMzD9Y=", "subType": "00" } } ] }
Advertencia
No modifique el campo __safeContent__
El campo __safeContent__ es esencial para el cifrado consultable. No modifique su contenido.