【问题标题】:How can I delete a property from object returned by mongoose如何从猫鼬返回的对象中删除属性
【发布时间】:2022-01-28 13:00:17
【问题描述】:

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

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 对象列表执行过滤,但也失败了。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    你可以解构查询返回的对象

    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()

    【讨论】:

    • 这是否意味着我无法对数据库返回的这些对象执行 javascript 操作?
    • 你可以。解构是一个 JavaScript 特性。
    • 我在文档中的某处阅读了 select: false 解决方案,但我在登录用户时需要密码。
    • 非常感谢。最后一个解决方案是我真正需要的。
    【解决方案2】:

    我会使用findeOne,最后是投影:

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

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

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      相关资源
      最近更新 更多