如何从Mongoose返回的对象中删除属性

vql8enpb  于 2022-10-22  发布在  Go
关注(0)|答案(3)|浏览(180)

我正在查询用户集合,我不想发回密码。我的主要观点是,我是否可以在MongoDB对象上执行Java操作。以下是我的代码:

router.get("/:userId", async (req, res) => {
  try {
    const user = await User.findById(req.params.userId);
    delete user.password;
    if (user.parent !== undefined) {
      const referrer = await User.findOne({ _id: user.parent });
      return res.json({ user, referrer });
    }
    res.json(user);
  } catch (error) {
    res.status(400).json(error);
  }
});

我要拿到这个产量

{
    "is_deleted": false,
    "packages": [],
    "_id": "5ed102f3fefa080404db01df",
    "name": "parent",
    "email": "parent@parent.com",
    "gender": "m",
    "password": "$2b$10$HTGaoy.AVmoG/A0c/vkikO0NnEBte7f2tvwt2FQE94bZlNiYTeX8i",
    "__v": 0
}

我试图对MongoDB对象列表执行筛选,但也失败了。

v7pvogib

v7pvogib1#

您可以分解从查询返回的对象

const {password, ...restProps } = await User.findById(req.params.userId);
const user = restProps;

您还可以配置User模型,以便在默认情况下从查询结果中排除password字段。

const UserSchema = new mongoose.Schema({
    ...
    password: {
       ...
       select: false
    }
});

如果您不想在默认情况下排除某个字段,可以调用select函数并指定不希望包含在查询结果中的属性。

const user = await User.findById(req.params.userId).select('-password');

有关这方面的更多信息,请参见SchemaType.Prototype.select()

qzwqbdag

qzwqbdag2#

我会使用findeOne,最后的投影如下:

const user = await User.findOne({ _id: req.params.userId },{ password: 0 });

通过将值设置为0,可以排除更多字段

wlzqhblo

wlzqhblo3#

当作为JSON发送到客户端时,您可以将未定义指定给该属性以忽略它。喜欢:

const user = await User.findById(id);
  user.password = undefined;
  res.status(200).json({
    status: 'success',
    user,
  });

相关问题