将 md5 哈希值添加到 mongo collection
Adding md5 hash value to mongo collection
问题: 我目前有一个 mongo collection,其中包含 100,000 个文档。每个文档有 3 个字段(_id、姓名、年龄)。我想向每个名为 hashValue 的文档添加第 4 个字段,它存储每个文档名称字段的 md5 哈希值。
我目前可以通过 mongo shell 或通过 Mongoose ODM 作为 nodeJS 应用程序的一部分与我的 collection 进行交互。
可能的解决方案:
- 使用Mongoose/nodeJs:
我知道这行不通(不要相信您可以用这种方式遍历游标),但希望它能说明我正在尝试做的事情。
var crypto = require('crypto');
MyCollection.find().forEach(function(el){
var hash = crypto.createHash('md5').update(el.name).digest("hex");
el.name = hash;
el.save()
});
Use mongo Shell - 与上面几乎相同,我意识到类似上面语法的东西可以工作。唯一的问题是我不知道如何在 mongo shell 中创建 md5 哈希。但我能够遍历每个文档并添加一个字段。
(可能的解决方法)- 这样做的目的是能够根据名称值的 md5 散列进行查询。我相信 mongo 允许您创建散列索引 (link here)。唯一的问题是我找不到任何人使用它进行查询的示例(似乎只用于分片),我不确定这是否会在以后工作。 (示例:我想对从用户那里收集的名称进行 md5 哈希,然后查询我的 mongo collection 以查看是否可以在 hashValue 字段中找到该 md5 哈希)
您可以使用 streams and update all the records using bulk.
在 mongoose 中遍历游标
mongoose.connection.on("open", function(err,conn) {
var bulk = MyCollection.collection.initializeUnorderedBulkOp();
MyCollection.find().stream()
.on('data', function(el){
var hash = crypto.createHash('md5').update(el.name).digest("hex");
// add document update operation to a bulk
bulk.find({'_id': el._id}).update({$set: {name: hash}});
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// execute all bulk operations
bulk.execute(function (error) {
// final callback
callback();
});
});
});
Javascript 已有名为 hex_md5 的 md5 哈希函数。它也可以在 mongo 控制台中使用。
> hex_md5('john')
527bd5b5d689e2c32ae974c6229ff785
因此,要更新您案例中的记录,您可以在 mongo 控制台中使用以下代码片段:
db.collection.find().forEach( function(data){
data.hashValue = hex_md5(data.name);
db.collection.save(data);
});
我个人不喜欢选择选项 3(即可能的解决方法)。两个原因——
1. 在查询数据时,我们必须确保应用程序使用与Mongo DB 相同的散列函数并以相同的方式来导出散列值。我认为 Mongo DB 使用 MD5 并且只考虑前 64 位哈希。我看到的缺点是应用程序与 Mongo 数据库哈希的内部实现相关联,并且可能随时更改。
- 散列索引适用于点查询(相等查询)。但它们不支持范围查询(age > & age > 50),like or regex queries (db.users.find({"name": /ABC/}).
有一点不清楚,为什么要存储名称列的 MD5 而不是在名称列本身上创建普通索引。可能这将有助于得出答案。
问题: 我目前有一个 mongo collection,其中包含 100,000 个文档。每个文档有 3 个字段(_id、姓名、年龄)。我想向每个名为 hashValue 的文档添加第 4 个字段,它存储每个文档名称字段的 md5 哈希值。
我目前可以通过 mongo shell 或通过 Mongoose ODM 作为 nodeJS 应用程序的一部分与我的 collection 进行交互。
可能的解决方案:
- 使用Mongoose/nodeJs:
我知道这行不通(不要相信您可以用这种方式遍历游标),但希望它能说明我正在尝试做的事情。
var crypto = require('crypto');
MyCollection.find().forEach(function(el){
var hash = crypto.createHash('md5').update(el.name).digest("hex");
el.name = hash;
el.save()
});
Use mongo Shell - 与上面几乎相同,我意识到类似上面语法的东西可以工作。唯一的问题是我不知道如何在 mongo shell 中创建 md5 哈希。但我能够遍历每个文档并添加一个字段。
(可能的解决方法)- 这样做的目的是能够根据名称值的 md5 散列进行查询。我相信 mongo 允许您创建散列索引 (link here)。唯一的问题是我找不到任何人使用它进行查询的示例(似乎只用于分片),我不确定这是否会在以后工作。 (示例:我想对从用户那里收集的名称进行 md5 哈希,然后查询我的 mongo collection 以查看是否可以在 hashValue 字段中找到该 md5 哈希)
您可以使用 streams and update all the records using bulk.
在 mongoose 中遍历游标mongoose.connection.on("open", function(err,conn) {
var bulk = MyCollection.collection.initializeUnorderedBulkOp();
MyCollection.find().stream()
.on('data', function(el){
var hash = crypto.createHash('md5').update(el.name).digest("hex");
// add document update operation to a bulk
bulk.find({'_id': el._id}).update({$set: {name: hash}});
})
.on('error', function(err){
// handle error
})
.on('end', function(){
// execute all bulk operations
bulk.execute(function (error) {
// final callback
callback();
});
});
});
Javascript 已有名为 hex_md5 的 md5 哈希函数。它也可以在 mongo 控制台中使用。
> hex_md5('john')
527bd5b5d689e2c32ae974c6229ff785
因此,要更新您案例中的记录,您可以在 mongo 控制台中使用以下代码片段:
db.collection.find().forEach( function(data){
data.hashValue = hex_md5(data.name);
db.collection.save(data);
});
我个人不喜欢选择选项 3(即可能的解决方法)。两个原因—— 1. 在查询数据时,我们必须确保应用程序使用与Mongo DB 相同的散列函数并以相同的方式来导出散列值。我认为 Mongo DB 使用 MD5 并且只考虑前 64 位哈希。我看到的缺点是应用程序与 Mongo 数据库哈希的内部实现相关联,并且可能随时更改。
- 散列索引适用于点查询(相等查询)。但它们不支持范围查询(age > & age > 50),like or regex queries (db.users.find({"name": /ABC/}).
有一点不清楚,为什么要存储名称列的 MD5 而不是在名称列本身上创建普通索引。可能这将有助于得出答案。