如何防止 findOneAndUpdate 将某些关键字更新到列?

How to prevent findOneAndUpdate update certain keywords to a column?

我有一个用户管理系统,其中管理员有权更新其用户的角色,如何防止管理员更新角色高于他的文档? 示例,权限降序排列: 1:超级管理员 2:管理员 3:主管 4: 用户

现在我有一个代码可以将用户的角色更新为:

router.post('/changeRole', async (req, res) => {
  const { email } = req.body;
  const updatedUser = await Users.findOneAndUpdate({ email }, { $set: { role } }, { new: true });
  }
);

通过上面的代码,管理员可以让任何人成为超级管理员,并为该用户提供所有访问权限。有没有像下面这样的方法来防止查询?

router.post('/changeRole', async (req, res) => {
  const { email } = req.body;
  const updatedUser = await Users.findOneAndUpdate({ email }, { $set: { role !== "superadmin" } }, { new: true });
  }
);

我认为这可以帮助你:

const updatedUser = await Users.findOneAndUpdate(
    {
        email: email,
        role: {$ne: "superadmin"}
    }, 
    { $set: role },
    { new: true }
);

$ne 运算符表示 not equal,因此这仅在电子邮件匹配且角色不同于 superadmin.

时更新文档