我有一个mongoose架构,我正在存储一个端口号。我也为该字段设置了默认值。
port:{
type:Number,
default:1234
}
如果我没有通过我的API获得任何价值,则会将其设置为1234
。
但是,如果有人发送null
,则会接受null
并保存到数据库。
它不应该将null
转换为1234
吗? null
不是数字!我理解错了吗?
我正在考虑给出here的解决方案,但是我不想为没有它的情况添加额外的代码(除非我错了,它不应该将null
转换为{{ 1}})
答案 0 :(得分:2)
请参阅此问题中的评论:
null是Date属性的有效值,除非您指定required。如果值未定义,则默认值仅被设置,而不是如果它是假的。
(它关于日期,但也可以应用于数字。)
您可以选择:
: ${AA="/root/"}
添加到字段你可能会使用这样的预保存或后验证(或其他)钩子:
required
但可能你必须使用类似的东西:
YourCollection.pre('save', function (next) {
if (this.port === null) {
this.port = undefined;
}
next();
});
有关如何在函数调用中使YourCollection.pre('save', function (next) {
if (this.port === null) {
this.port = 1234; // get it from the schema object instead of hardcoding
}
next();
});
触发默认值的一些技巧,请参阅此答案:
令人遗憾的是,Mongoose无法配置为null
null
(带有一些" not-null"参数或类似的东西),因为有时会出现这样的情况:您使用JSON作为请求获得的数据,有时可以将undefined
转换为null:
undefined
甚至在没有(显式)> JSON.parse(JSON.stringify([ undefined ]));
[ null ]
的情况下添加null
值:
undefined
答案 1 :(得分:1)
如猫鼬官方文档here
中所述编号 要将路径声明为数字,可以使用Number全局构造函数或字符串'Number'。
const schema1 = new Schema({ age: Number }); // age will be cast to a Number
const schema2 = new Schema({ age: 'Number' }); // Equivalent
const Car = mongoose.model('Car', schema2);
There are several types of values that will be successfully cast to a Number.
new Car({ age: '15' }).age; // 15 as a Number
new Car({ age: true }).age; // 1 as a Number
new Car({ age: false }).age; // 0 as a Number
new Car({ age: { valueOf: () => 83 } }).age; // 83 as a Number
如果您传递一个带有valueOf()函数的对象,该对象返回一个Number,Mongoose将对其进行调用并将返回的值分配给该路径。
null和undefined值不会被强制转换。
NaN,强制转换为NaN的字符串,数组以及不具有valueOf()函数的对象都将导致CastError。