是否可以在mongodb中的加密字段上进行部分搜索(如/ regex查询)?
我有一个包含加密电子邮件ID的字段。因此,在mongo中,电子邮件some@email.com
变为1bcuh6762jhjdSOME_ENCRYPTED_VALUE
,现在可以对此加密值进行部分搜索
答案 0 :(得分:1)
通过创建超过3个字母的所有可能值的哈希,我遇到了一个类似的问题我解决了它。并为所有可能的组合创建哈希,您可以使用pre('save')
添加要设置的值。
在架构中您可以创建此功能:
function createHash(next) {
this.hashes = hash.createHashForField(this.text);
debug(text);
next();
}
mySchema.pre('save', createHash);
散列hash.js
const hash = require('crypto');
const adler32 = require('adler32');
const crypto = require('crypto');
const _ = require('lodash');
adler32.register();
module.exports = Hash = {
/**
* This method creates hash of given text;
* @param text - text to hash;
*/
createHash: (text) => {
return crypto.createHash('adler32').update(text, 'ascii').digest('hex');
},
/**
*
* @param text- text separated by spaces
*/
createHashForText: (text) => {
"use strict";
text= text.toLowerCase();
text= text.trim();
let textSlices = _.flatten(text.split(' ').filter(x => x.length)
.map((part) => {
if (part.length < 3) {
return part;
}
let nameSlices = [];
for (let index = 2; index < part.length; index ++) {
let n = part.slice(0, index+1);
textSlices .push(n);
}
return textSlices ;
}));
return textSlices .map(n => Hash.createHash(n));
}
}
之后你可以像这样迁移所有记录:
myModel.find({}).then(docs => {
docs.forEach(doc => doc.save().catch(console.log))
})
现在搜索时,您必须使用createHash
函数来创建关键字的哈希并在数据库中搜索它。
我希望这会有所帮助。