如何在Mongoose父Schema中为子Schema设置默认值?
Mongoose嵌套Schema设置默认值的正确方法
你之前的写法错误在于直接展开daySchema(Mongoose的Schema实例)作为默认值,这不是普通的JS数据对象,无法被Mongoose识别为子文档的默认结构,所以默认值不生效。以下是几种正确的实现方式:
方法一:直接构造符合子Schema结构的默认值对象
在父Schema的字段中,通过函数返回符合子Schema结构的普通JS对象作为默认值(用函数返回是Mongoose推荐的做法,避免多个文档共享同一引用类型对象的问题):
const programoSchema = mongoose.Schema({ monday: { type: daySchema, default: () => ({ day: "Pazartesi", // 按需为am1、pm1等子字段设置默认值,需符合periodSchema的结构 am1: {}, am2: {}, am3: {}, pm1: {}, pm2: {}, pm3: {} }) }, tuesday: daySchema, wednesday: daySchema, thursday: daySchema, friday: daySchema });
方法二:在子Schema中定义默认值,父Schema自动继承
如果希望所有子文档都有基础默认值,或者仅需覆盖部分字段的默认,可以先在daySchema中定义字段默认值,父字段只需设置默认空对象,Mongoose会自动填充子Schema的默认值:
// 先在子Schema中定义各字段默认值 const daySchema = mongoose.Schema({ day: { type: String, default: "Pazartesi" }, am1: { type: periodSchema, default: {} }, am2: { type: periodSchema, default: {} }, am3: { type: periodSchema, default: {} }, pm1: { type: periodSchema, default: {} }, pm2: { type: periodSchema, default: {} }, pm3: { type: periodSchema, default: {} } }); // 父Schema中设置默认空对象,自动继承子Schema的默认值 const programoSchema = mongoose.Schema({ monday: { type: daySchema, default: () => ({}) }, tuesday: daySchema, wednesday: daySchema, thursday: daySchema, friday: daySchema });
方法三:动态生成默认值(按需使用)
如果需要根据逻辑动态生成默认子文档,可以在default中使用函数,在函数内编写动态逻辑:
const programoSchema = mongoose.Schema({ monday: { type: daySchema, default: function() { // 这里可以添加动态逻辑,比如根据当前时间生成字段值 return { day: "Pazartesi", am1: { /* 自定义periodSchema结构的默认值 */ }, // 其他字段 }; } }, // 其他字段 });
内容的提问来源于stack exchange,提问作者M. Selim Yaman
相关产品推荐
相关产品推荐

