首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将唯一值传递给mongodb updateMany $set

如何将唯一值传递给mongodb updateMany $set
EN

Stack Overflow用户
提问于 2022-01-18 18:15:47
回答 1查看 333关注 0票数 1

我试图为MongoDB集合中的每个文档创建唯一的密码。尽管该函数工作正常,但它为每个用户创建相同的密码。

下面是我目前使用的代码:

代码语言:javascript
复制
  function createPasswords(){
     db.collection('users').updateMany({}, {$set:{password: GeneratePassword(12, false)}});
    
    }

我预计每个文档都会运行GeneratePassword函数,但显然它只运行了一次,因为结果是集合中每个用户的随机密码。

我的问题是,在这种情况下,如何使用updateMany为每个用户同时创建唯一的密码。

顺便说一句,GeneratePassword函数不是自定义函数,而是调用password-generator包。

提前感谢!

更新

下面我尝试了以下基于turivishal的答案的代码。

代码语言:javascript
复制
 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.

如果有人能发现这里出了什么问题,我将非常感谢您的指导。

EN

回答 1

Stack Overflow用户

发布于 2022-01-18 19:01:56

update() / updateMany()方法在MongoDB中是一个单一的写操作,修改了多个文档,每个文档的修改都是原子化的。(我们不能说整个操作按照文档是原子的),但是它不会更新每个集合文档中的不同值。

您必须一个接一个地更新它,或者通过循环进行更新,或者您可以尝试从使用聚合管道进行更新 4.2开始的MongoDB查询,它允许一个更有表现力的update语句,$function从MongoDB 4.4开始,在JavaScript中定义一个自定义聚合函数或表达式。

只有当这是一个一次性的过程时,我才会建议这个查询,因为它会影响查询的速度和性能,并且根据操作符的支持,这个查询将支持来自MongoDB 4.4或更高版本的。

代码语言:javascript
复制
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"
        }
      }
    }
  }]
)

游乐场

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70760496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档