mongodb用mongoose取到的对象不能增加属性
先定义了一个article的schema
var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schema = new Schema({ title: String,//标题 description: String,//描述 content: String,//内容 status:{type: Number, defalut: 0}, //未发布:0 ,发布:1 create_at: {type: Date, default: Date.now}//添加时间 });
增加一条测试数据:
var o = new articleModel(); o.title = 'hello'; o.content = '这是一篇测试文章'; o.save(function(err,result){ if(err){ console.log(err.message); } console.log(result); });
下面使用findOne方法获取这条记录,在获取到的记录上增加一个remark属性,并在控制台输出结果
articleModel.findOne({title: 'hello'}, function (err, article) { article.remark = '备注'; console.log(article); }); 结果:{ "content":"这是一篇测试文章", "title":"hello", "_id":"56f5ee83fcfad37f1371e952", "__v":0, "status":0, "create_at":"2016-03-26T02:05:55.814Z" }
发现结果中remark属性没有显示,同时在schema中声明过的description也没有显示(因为增加数据的时候就没有设置description的值)。我现在把description也设置一个值看看查询结果:
articleModel.findOne({title: 'hello'}, function (err, article) { article.remark = '备注'; article.description = '这是描述'; console.log(article); }); 结果:{"description":"这是描述", "content":"这是一篇测试文章", "title":"hello", "_id":"56f5ee83fcfad37f1371e952", "__v":0, "status":0, "create_at":"2016-03-26T02:05:55.814Z" }
我们在发现description赋值成功,但是增加的remark属性还是无效。
这是为什么呢?因为Mongoose是個ODM (Object Document Mapper),类似于操作关系型数据库使用的ORM(Object Relational Mapper),我们使用Mongoose取到的数据的结构是要依赖于我们定义的schema结构的。增加的remark属性在schema中没有定义,所以我们在取到的结果中增加remark属性是无效的,而description属性先前在结构中有定义(不算新增),所以可以重新设置值。
结论:mongodb中使用mongoose取到的对象不能增加属性。
接着问题是,如果我需要在结果中补充新的属性使用怎么办?
方法1、在schema中直接增加需要补充的属性。
exports.schema = new Schema({ title: String,//标题 description: String,//描述 content: String,//内容 remark:String, //备注(补充新属性,现在和description一样了) create_at: {type: Date, default: Date.now}//添加时间 });
方法2、把查询到的结果clone一个对象,然后在新对象中补充属性。
articleModel.findOne({title: 'hello'}, function (err, article) { var newobj = null; if(article){ newobj = { _id:article._id, title: article.title,//标题 description: article.description,//描述 content: article.content,//内容 remark:"备注", create_at: article.create_at, status: article.status, status_name: article.status==1?'发布':'未发布'; }; } console.log(newobj); });
方法3:像上面的例子在schema中已经有了status表示状态,如果我们仅仅需要一个status_name显示文章状态的中文解释。不要clone新对象的方式,可以使用schema的虚拟属性。
声明修改一下如下: var mongoose = require('mongoose'); var Schema = mongoose.Schema; var schema = new Schema({ title: String,//标题 description: String,//描述 content: String,//内容 status: {type: Number, defalut: 0}, //未发布:0 ,发布:1 create_at: {type: Date, default: Date.now}//添加时间 }); schema.virtual('status_name').get(function () { return this.status == 1 ? '发布' : '未发布'; }); exports.schema = schema; 查询到结果后可以直接使用status_name属性: articleModel.findOne({title: 'hello'}, function (err, article) { console.log(article.stauts_name); });