Mongoose 单个嵌入子文档默认

Posted

技术标签:

【中文标题】Mongoose 单个嵌入子文档默认【英文标题】:Mongoose single embedded sub-document default 【发布时间】:2016-05-31 09:51:10 【问题描述】:

Mongoose 在 4.2.7 版中创建了一个新的单个子文档功能(documentation 和 feature request),允许单个嵌入式子文档架构,其行为方式与一对多子文档的行为方式相同。

在父级保存时创建默认单个子文档的最佳方法是什么?

var UserPermisssionsSchema = new mongoose.Schema(
    siteAdmin: 
        type: Boolean,
        default: false,
    
);

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions: UserPermisssionsSchema 
);

我希望在创建父用户文档时使用默认值创建 permissions 字段。

这不起作用:

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions: 
    type: UserPermisssionsSchema ,
    default: UserPermisssionsSchema
  
);

【问题讨论】:

【参考方案1】:

请试试这个

var PerSchema = new mongoose.Schema(
    siteAdmin: type: Boolean, default: false
  ); 

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions:  type: PerSchema, default: () => () ,
);

Mongoose v4.4.3测试它

var User = mongoose.model('User', UserSchema);

function setUser() 
    var u = new User(
        fname: 'asa',
        lname: 'dddd'
    );

    u.save(function(err) 
        if (err)
            console.log(err);
        else
            console.log('save user successfully');
    );

结果是

 
  "_id" : ObjectId("56c68321a548be98198ebb71"), 
  "fname" : "asa", 
  "lname" : "dddd", 
  "permissions" : 
       "_id" : ObjectId("56c68321a548be98198ebb70"), 
       "siteAdmin" : false
       ,
   "__v" : 0


如果你想要permissions 的默认值是。请尝试如下

var PerSchema = mongoose.Schema(
    siteAdmin: type: Boolean
, _id: false); 

var UserSchema = mongoose.Schema(
    fname: String,
    lname: String,
    permissions:  type: PerSchema, required: true, default:  ,
); 

测试

function setUser() 
    var u = new User(
        fname: 'asa',
        lname: 'dddd'
    );

    u.save(function(err) 
        if (err)
            console.log(err);
        else
            console.log('save user successfully');
    );

结果是

 "_id" : ObjectId("56c687427191d54021875fb1"), 
  "fname" : "asa", 
  "lname" : "dddd",
  "permissions" :   , 
  "__v" : 0

【讨论】:

这也不起作用。错误是:key $__ must not start with '$' @steampowered,我测试它并在我的答案中显示结果,如果我错过了什么,请告诉我...... 出现错误时我正在使用4.2.7,但现在当我升级到 4.4.3 时它可以工作了! 您有什么理由将PerSchema 定义为 mongoose.SchemaUserSchema 简单地mongoose.Schema 请不要将default 设置为模式实例。 default: PerSchema 是错误的,并在最近版本的 Mongoose 中引发错误。请改用default: () => ()【参考方案2】:

这里是 Mongoose 的维护者,我推荐这个:

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions: 
    type: UserPermisssionsSchema ,
    default: () => (),
  
);

这将使permissions 默认为空对象,相对于UserPermissionsSchema 可能具有的任何默认值。如果您将default 设置为UserPermisssionsSchema,如果您的某个属性碰巧与猫鼬模式方法重叠,您可能会遇到一些不良行为。

【讨论】:

如果我们不使用外部定义架构,而是使用 type:Object 并仅定义嵌入在权限字段中的子文档,您如何设置默认值?【参考方案3】:

Mongoose 单个嵌入子文档默认

var UserPermisssionsSchema = new mongoose.Schema(
    siteAdmin: 
        type: Boolean,
        default: false,
    
);

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions: 
    type: UserPermisssionsSchema,
    default: () => (),
)

Mongoose 多个(Array) 嵌入子文档默认

var UserPermisssionsSchema = new mongoose.Schema(
    siteAdmin: 
        type: Boolean,
        default: false,
    
);

var UserSchema = mongoose.Schema(
  fname: String,
  lname: String,
  permissions: 
    type: [UserPermisssionsSchema],
    default: () => ([]),
)

【讨论】:

以上是关于Mongoose 单个嵌入子文档默认的主要内容,如果未能解决你的问题,请参考以下文章

更新 mongoose 子文档会修改原始模式

单独文件上的 Mongoose 子文档,如何嵌入它们

Mongoose:如何将子文档中的数组提取到父文档中的单个数组中

访问 mongoose 父文档以获取子文档中的默认值

构建我的猫鼬模式的最佳方式:嵌入式数组、填充、子文档?

文档不会使用带有 mongoose 的 save() 方法保存