Mongoose没有使用模型执行类型save()

时间:2014-06-11 02:24:53

标签: javascript node.js mongodb mongoose

在我的架构中,我有:

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中是自动的,无需自定义验证。

1 个答案:

答案 0 :(得分:1)

好的,可能更多信息而不仅仅是评论。您已在字段中要求String类型。因此,猫鼬做了它通常应该做的事情,并确保这是一个字符串。

您的号码实际上是一个对象的所有JavaScript对象都继承了.toString()方法。所以这里发生的是调用方法,数据以字符串形式传入。

在你最喜欢的REPL中试试这个:

var data = {};
data.number = 1;

data.number.toString();

这表明该方法有效。

反之则不然,因为String不能隐式地转换为数字。因此,如果您为架构字段定义了一个数字,那么String实际上将无法通过验证:

var data = {}
data.number = "1"

所以这真的是“JavaScript如何运作”的问题,而不是关于猫鼬验证。