博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb用mongoose取到的对象不能增加属性
阅读量:6531 次
发布时间:2019-06-24

本文共 2917 字,大约阅读时间需要 9 分钟。

先定义了一个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); });

 

转载于:https://www.cnblogs.com/fhen/p/5322493.html

你可能感兴趣的文章
python之set集合基本操作
查看>>
数组排序
查看>>
Linux系统搭建java开发环境
查看>>
【NetApp】模拟器root volume损坏的解决方法
查看>>
正则扩展
查看>>
我的友情链接
查看>>
linux
查看>>
mysql 中的坑!!(持续更新)
查看>>
《系统运维全面解析:技术、管理与实践》纠错汇总
查看>>
Controller计算值传到jsp页面,用session传值
查看>>
用路由器上网说明你们两个人的机子都是内网
查看>>
庸人败于惰,能人败于傲
查看>>
团队代码中Bug太多怎么办?怎样稳步提高团队的代码质量
查看>>
我的移动互联网平台梦
查看>>
awk使用详解
查看>>
【Python】安装MySQL-python-1.2.5
查看>>
磁盘高负荷把MYSQL拖垮(请用火狐浏览器浏览)
查看>>
http和socket之长连接和短连接区别
查看>>
Linux-Shell简介——文件名匹配/输出重定向
查看>>
我的友情链接
查看>>