在我的架构中,我有:
var CpuSchema = new Schema({
timeStamp : { type : Date, index: true },
avaiable : Boolean,
status : String,
在我保存文档的功能中:
function saveCpu(cpuResult) {
console.log("THE TYPE IS: " + typeof(cpuResult.metrics["15m"].data));
var cpu = new Cpu ({
timeStamp : cpuResult.timestamp,
avaiable : cpuResult.available,
status : cpuResult.metrics["15m"].data,
但是在输出模型的save()中:
THE TYPE IS: number
Mongoose: cpus.insert({ __v: 0, metrics: [ '[object Object]', '[object Object]', '[object Object]' ], _id: ObjectId("5397bcf1803ee2e535776934"), status: '0.05', avaiable: true, timeStamp: new Date("Wed, 11 Jun 2014 02:22:06 GMT") }) {}
status : String,
未显示验证错误,因为cpuResult.metrics["15m"].data
类型为Number
而非String
...而是将数字转换为字符串。为什么是这样?我想在类型上进行验证,我认为这在Mongoose中是自动的,无需自定义验证。
答案 0 :(得分:1)
好的,可能更多信息而不仅仅是评论。您已在字段中要求String
类型。因此,猫鼬做了它通常应该做的事情,并确保这是一个字符串。
您的号码实际上是一个对象的所有JavaScript对象都继承了.toString()
方法。所以这里发生的是调用方法,数据以字符串形式传入。
在你最喜欢的REPL中试试这个:
var data = {};
data.number = 1;
data.number.toString();
这表明该方法有效。
反之则不然,因为String不能隐式地转换为数字。因此,如果您为架构字段定义了一个数字,那么String实际上将无法通过验证:
var data = {}
data.number = "1"
所以这真的是“JavaScript如何运作”的问题,而不是关于猫鼬验证。