在MongooseJS中,我正在尝试基于POST数据创建一个新的模型实例。在某些情况下,我希望一个字段具有模式中定义的默认值,但是当我传入null
或undefined
获取该属性的值时,我没有获得默认值。产生Mongo对象(当我根本没有传入属性时,我只获得默认值。)
var objSchema = mongoose.Schema({
foo: { type: Number, default: 10 },
bar: { type: Number, default: 10 },
baz: { type: Number, default: 10 }
});
var Obj = db.model('Obj', objSchema)
// note that `baz` is not passed in below
var obj = new Obj({
foo: null,
bar: undefined
});
obj.save(function(err, savedobj){
console.log(savedobj) // { foo: NULL, baz: 10 }
});
我不想为可能没有值的属性的每个潜在排列编写单独的对象实例化代码,我是否可以将foo
和bar
设置为导致默认值?这似乎对我来说应该是常见的情况,但也许我只是错过了一些东西?
答案 0 :(得分:1)
我认为,你应该在你的架构中添加一个setter,如下所示。但它只在您添加新记录时才有效。当您更新文档时,它不起作用。我希望它有所帮助;
function inspector (val) {
if (typeof val == "object" || typeof val == "undefined" || typeof val == "string" || val == 0)
return 10;
else
return val;
}
var objSchema = mongoose.Schema({
foo: { type: Number, default: 10, set: inspector },
bar: { type: Number, default: 10, set: inspector },
baz: { type: Number, default: 10, set: inspector },
qux: { type: Number, default: 10, set: inspector }
});
var obj = new Obj({
foo: null,
bar: undefined,
baz: 0,
qux: "incorrect",
});
obj.save(function(err, savedobj){
console.log(savedobj) // { foo: 10, bar: 10, baz: 10, qux: 10 }
});
有关详情,请访问https://github.com/LearnBoost/mongoose/blob/master/lib/schematype.js#L250