Mongoose单个嵌入式子文档默认

时间:2016-02-18 23:58:09

标签: mongoose

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

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

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

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

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

这不起作用:

编辑:这现在在Mongoose发生变化后工作,发生在4.2.7和4.4.3之间

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

3 个答案:

答案 0 :(得分:19)

请尝试这个

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

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

使用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
}

答案 1 :(得分:8)

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

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

这将使permissions默认为空对象,相对于UserPermissionsSchema可能具有的任何默认值。如果将default设置为UserPermisssionsSchema,如果您的某个属性恰好与mongoose架构方法重叠,则可能会出现一些不良行为。

答案 2 :(得分:0)

默认为猫鼬的单个嵌入式子文档

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

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

猫鼬多(数组)嵌入式子文档默认值

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

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