【问题标题】:Why there is two property named _id and id and only one is visible in object return by mongoose?为什么有两个名为 _id 和 id 的属性,而猫鼬返回的对象中只有一个可见?
【发布时间】:2020-12-02 19:17:20
【问题描述】:

当我打印在 MongoDB 中使用 mongoose 查询后返回的对象时,我得到一个对象,其中包含一个键作为“_id”。但是,当我尝试通过访问对象来打印对象的属性 id 和 _id 时,它并没有说 id 未定义,而是打印与 _id 相同的 id。我在下面附上代码和输出的屏幕截图。

这里是代码 sn-p

const user = await User.findById(req.params.id);
console.log(user);
console.log(user.id, user._id);

在下面的输出中,我们可以看到 id 和 _id 包含相同的值,即使用户对象中没有可用的属性为 'id'

{
  role: 'user',
  _id: 5fc6cad25884d51790aad697,
  name: 'Test 001',
  email: 'test001@gmail.com',
  __v: 0
}
5fc6cad25884d51790aad697 5fc6cad25884d51790aad697

【问题讨论】:

    标签: javascript node.js mongodb


    【解决方案1】:

    我想你最容易混淆的部分是id 它来自哪里。以下是文档中的解释:

    默认情况下,Mongoose 会为您的每个模式分配一个 id 虚拟 getter 它将文档的 _id 字段转换为字符串,或者在 ObjectIds 的情况,它的 hexString。如果您不想添加 id getter 到您的架构,您可以通过在架构中传递此选项来禁用它 施工时间。 const schema = new Schema({ name: String }, { id: false });

    虚拟是您可以获取和设置但无法获取的文档属性 持久化到 MongoDB。 getter 对于格式化或 组合字段,而 setter 可用于分解单个字段 值分成多个值进行存储。

    您可以在文档中阅读更多相关信息:

    id - https://mongoosejs.com/docs/guide.html#id

    virtuals - https://mongoosejs.com/docs/guide.html#virtuals

    【讨论】:

      【解决方案2】:

      检查用户对象是否存在与实例相关的问题,否则不会发生。

      【讨论】:

        猜你喜欢
        • 2015-03-17
        • 2013-03-21
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 1970-01-01
        相关资源
        最近更新 更多