【问题标题】:Mongoose rename _id to id on child docsMongoose 在子文档上将 _id 重命名为 id
【发布时间】:2018-06-18 01:19:45
【问题描述】:

我有这个 Mongoose 模型架构,其中包含“硬编码”子文档 而且我不知道如何将 _id 重命名为子文档的 id。

对于父级,我也使用以下代码来包含 id 属性,但这似乎不适用于子文档。

menuItemSchema.set('toJSON', {
  virtuals: true
})

我尝试了什么:

menuItemSchema.set('toJSON', {
  virtuals: true,
  extras: {    // <-- child
    virtuals: true,
  }
})

架构

const menuItemSchema = mongoose.Schema({
  name: {
    type: String
  },
  extras: [{   // <-- child
    name: {
      type: String
    },
    ...otherProps
  }],
  ...otherProps
})

menuItemSchema.set('toJSON', {
  virtuals: true
})

有办法吗?我是否需要创建一个单独的架构来启用

.set('toJSON', { virtuals: true })

结果

{
  "_id": "5b2691666034483916a59fe8",
  "name": "Margharita",
  "extras": [
    {
      "_id": "5b2691666034483916a59fed",
      "name": "Sauce"
      // ^ got no id
    }, 
    ...
  ],
  "__v": 0,
  "id": "5b2691666034483916a59fe8"  // <- got id
}

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    toJSON/toObject 不接受选项extras,它不会对架构执行任何操作。 Reference

    默认情况下,Mongoose 文档将有一个 id 虚拟 getter。 Refercence

    尝试明确定义子架构:

    const ExtraSchema = new Schema({...});
    
    const menuItemSchema = new Schema({
      extras : [ExtraSchema]
    });
    

    如果这不起作用,请尝试toJSON 中的transform 选项:

    ExtraSchema.set('toJSON', {
      transform : (doc, result) => {
        return {
          ...result,
          id : result._id
        };
      }
    });
    

    【讨论】:

    • 所以据您所知,如果不定义单独的架构,就没有办法做到这一点?
    • 如果你不关心值,你可以直接在父模式的子模式中定义一个id属性,那么你的extra将有两个不同的_idid。否则,定义一个单独的架构可以让您对其进行更多控制。
    猜你喜欢
    • 2020-10-27
    • 2017-10-09
    • 2018-02-27
    • 2013-11-14
    • 1970-01-01
    • 2018-02-09
    • 2018-06-25
    • 2019-09-13
    相关资源
    最近更新 更多