[求助] Mongoose 数据类型的问题
发布于 10 年前 作者 kenticny 9076 次浏览 最后一次编辑是 8 年前

在mongoose中定义以下Schema:

var v = new Schema({
    name: { type: String },
    status: { type: Number }
});

然后在查询结果中想将Number类型的status字段替换成字符串返回:

model.find(function(datas) {
    datas.forEach(function(n){
        switch(n.status) {
            case 1: n.status = "正常"; break;
            case 2: n.status = "不正常"; break;
            default: n.status = "未知"; break;
        }
    })
    res.render("a", {data:datas});
});

但是,由于model里面定义的status字段类型是Number,所以导致这里遍历结果集修改字段为字符串不生效。 请教下这里应该怎么处理啊(PS:排除在view中进行处理的方法)

4 回复

推荐你使用mongoose的Virtuals属性,参见http://mongoosejs.com/docs/guide.html

这是个localization的问题,确实是放在view中处理比较合理 此外,mongoose对String提供enum支持:

var v = new Schema({
    name: { type: String },
    status: { type: String, enum: ['normal', 'abnormal', 'unknown'] }
});

你这里修改status不成功原因是mongoose的查询返回的是mongoose的document对象,不要当成POJO处理,这是个大坑,一定要记住,很多莫名其妙的错误都来源于此

document可以用toObject转换成POJO对象

model.find(function(datas) {
    datas.forEach(function(n, index){
        n = n.toObject();
        switch(n.status) {
            case 1: n.status = "正常"; break;
            case 2: n.status = "不正常"; break;
            default: n.status = "未知"; break;
        }
        datas[index] = n;
    })
    res.render("a", {data:datas});
});

我尝试将结果集遍历重新赋值给另一个遍历,结果还是不行,我想到可能是由于mongoose返回的原因。 但是有点想不通的是,对于Javascript来说,应该就是Object类型,我通过输出发现结果接只是单纯的查询结果,如果是特殊的类型应该返回的是包含有一坨坨自定义原型的结构吧。

回到顶部