在 mongoose 中为用户分配角色

Posted

技术标签:

【中文标题】在 mongoose 中为用户分配角色【英文标题】:Assign roles to users in mongoose 【发布时间】:2021-06-29 18:30:19 【问题描述】:

我正在尝试使用 mongoose 更新用户角色。我一直在使用猫鼬 findOneAndUpdate 但无法更新角色。我没有收到任何错误消息,但我在更新之前获得了文档。所以我做了一些研究并尝试添加new:true,但它并没有改变任何东西。然后我看到有人使用聚合查询$push,但这也没有用。

我已经多次重写这个查询,但没有给出预期的结果

 exports.changeRole = async (req, res) => 
  User.findOneAndUpdate(
     id: req.param.userId ,
    
      $push: 
        $set:  "roles[0].name": req.body.name ,
      ,
    ,
     new: true 
  )
    .populate("roles", "-__v")
    .exec((err, data) => 
      if (err) 
        console.log(err);
       else 
        console.log(data);
      
    );
;

我如何发送邮递员


"roles": ["Admin"]

这是我在控制台中得到的:


  roles: [  _id: 606242fa3bcbc13305bee567, name: 'user'  ],
  _id: 606307a839a54f7982f8ff84,
  username: 'before',
  email: 'before@gmail.com',
  password: '$2a$/lvMv80IPZe9FSm',
  __v: 1

我有一个名为 User 的模型

const userSchema = new mongoose.Schema(
  
    username: 
      type: String,
      required: true,
      min: 6,
      max: 255,
    ,
    email: 
      type: String,
      required: true,
      min: 6,
      max: 255,
    ,
    password: 
      type: String,
      required: true,
      min: 6,
      max: 15,
    ,
    roles: [
      
        type: mongoose.Schema.Types.ObjectId,
        ref: "Role",
      ,
    ],
  ,
   timestamp: true 
);

此用户模型引用 Role.js。 objectId:s 的数组。因此,如果它们不存在,我会自动创建四个角色文档。每个用户都在引用其中一个文档(角色)

const Role = mongoose.model(
  "Role",
  new mongoose.Schema(
    name: String,
  )
);

【问题讨论】:

req.body.name 我认为应该是 req.body.roles 根据您从邮递员发送的内容。 好的,我改变了,但我仍然在控制台中得到相同的输出。它会查找并填充,但不会更新任何内容。这让我想知道是否需要使用多个查询来更新? @TusharGupta-curioustushar 试试$set: "roles.0.name": req.body.roles @TusharGupta-curioustushar 什么都没有。在更新之前它仍然是 console.logs 使用awaitdeveloper.mozilla.org/en-US/docs/Web/javascript/Reference/… 【参考方案1】:

我的想法不对。我不需要更改填充的文档,只需要更改它在 User.js 中的 roles:[] 中引用的 objectId。使用 $set 更改字段并使用 $push to 添加新值。

exports.changeRole = async (req, res) => 
  await User.findOneAndUpdate(
     id: req.params.userId ,
    
      $set:  roles: req.body.roles ,
    ,

     new: true 
  )
    .populate("roles")
    .then((data) => 
      if (!data) return res.status(404).send("Not found");
      res.send(data);
    )
    .catch((err) => 
      return res.status(500).send( message: err.message );
    );
;

【讨论】:

以上是关于在 mongoose 中为用户分配角色的主要内容,如果未能解决你的问题,请参考以下文章

使用用户 SPI 在 Keycloak 中为外部用户分配角色

导轨 4 |使用位掩码在表单中为用户分配角色 |榜样

如何在 Laravel 中为 1 个路由分配 2 个或多个用户角色?

我如何在 laravel 中为 spatie 包(ACL 管理)中的其他角色分配用户列表权限?

帮助在特定模型实例中为用户分配角色的数据库策略

是否可以在 keycloak 中为不同组中的用户添加不同的角色?