我试图为MongoDB集合中的每个文档创建唯一的密码。尽管该函数工作正常,但它为每个用户创建相同的密码。
下面是我目前使用的代码:
function createPasswords(){
db.collection('users').updateMany({}, {$set:{password: GeneratePassword(12, false)}});
}我预计每个文档都会运行GeneratePassword函数,但显然它只运行了一次,因为结果是集合中每个用户的随机密码。
我的问题是,在这种情况下,如何使用updateMany为每个用户同时创建唯一的密码。
顺便说一句,GeneratePassword函数不是自定义函数,而是调用password-generator包。
提前感谢!
更新
下面我尝试了以下基于turivishal的答案的代码。
db.collection('users').updateMany({},[{
$set: { updated: 'true',
password: {
$function: {
body: function() {
$function: {
function passGen(param1, param2) {
return GeneratePassword(param1,param2)
}
return passGen(12, false);
}
},
args: [],
lang: "js"
}
}
}
}]);这产生了以下错误:
MongoServerError: Invalid $set :: caused by :: The body function must be specified.
如果有人能发现这里出了什么问题,我将非常感谢您的指导。
发布于 2022-01-18 19:01:56
update() / updateMany()方法在MongoDB中是一个单一的写操作,修改了多个文档,每个文档的修改都是原子化的。(我们不能说整个操作按照文档是原子的),但是它不会更新每个集合文档中的不同值。
您必须一个接一个地更新它,或者通过循环进行更新,或者您可以尝试从使用聚合管道进行更新 4.2开始的MongoDB查询,它允许一个更有表现力的update语句,$function从MongoDB 4.4开始,在JavaScript中定义一个自定义聚合函数或表达式。
只有当这是一个一次性的过程时,我才会建议这个查询,因为它会影响查询的速度和性能,并且根据操作符的支持,这个查询将支持来自MongoDB 4.4或更高版本的。
db.collection('users').updateMany(
{},
[{
$set: {
password: {
$function: {
body: function() {
// write your generate password method here
function GeneratePassword(param1, param2) {
// ...
}
// this will call internal method and return password
return GeneratePassword(12, false);
},
args: [],
lang: "js"
}
}
}
}]
)https://stackoverflow.com/questions/70760496
复制相似问题