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

mongodb用mongoose取到的对象不能增加属性的更多相关文章

  1. mongodb用mongoose得到的对象不能增加属性解决

    一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var produ ...

  2. php 给对象动态增加属性 及子类继承父类的构造方法

    <?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public  ...

  3. mongodb用mongoose查库的对象,不能增加属性

    node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...

  4. mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...

  5. MongoDB 和 Mongoose 04

    一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...

  6. 【重学Node.js 第3篇】mongodb以及mongoose的使用

    mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-serve ...

  7. 前端知识点回顾——mongodb和mongoose模块

    mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条 ...

  8. spring data mongodb中,如果对象中的属性不想加入到数据库字段中

    spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...

  9. Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。

    Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...

随机推荐

  1. CPU的ADDR2为什么跟SDRAM的0地址线接在一起

    出处:http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=11544&fromuid=5490 最近看到坛子里很多初学者对于C ...

  2. Unix 基础IO

    内核通过文件描述符引用打开的文件,通常通过open函数或者create函数返回文件描述符. 基本函数: unix中基础的文件操作函数只有5个,分别是open,close,lseek,read,writ ...

  3. uvalive 2797 Monster Trap

    题意:给定一些线段障碍,判断怪物能不能逃离到无穷远处. 思路:从(0,0)点能否到无穷远处.用BFS搜索.那满足什么样的点符合要求,能加入到图中呢? 遍历每个点,显然一开始已经在某些线段上的点要删去. ...

  4. windows串口通信的一个活动图

    1,打开串口的活动图: 2,关闭串口的活动图:

  5. Tomcat普通用户部署教程(生产服务器)

    1.环境准备 JDK安装 解压     tar xf tomcat-xx.tar.gz -C /data/soft     cd /data/soft 重命名     mv tomcat-xx tom ...

  6. SQL2008R2日志传送需要注意点

    当SQL2008R2采用日志传送方式进行备份/还原时需要注意事项 主从数据库机器必须是局域网内可互相通过共享访问的主机 主从数据库须添加系统帐号,并将sqlagent服务的启动帐号设定为此帐号,最好主 ...

  7. Android实例-解决启动黑屏问题(XE8+小米2)

    结果: 1.在启动时马上出现图片界面,但在出现程序界面前会有黑屏,大约有0.2秒左右. 实现: 1.建立2个文件:loading.png和styles.xml: ①其中loading.png是启动时替 ...

  8. [iOS基础控件 - 4.3] APP列表 xib的使用

    A.storyboard和xib 1.storyboard: 相对xib较重量级,控制整个应用的所有界面 2.xib: 轻量级,一般用来描述局部界面   B.使用 1.新建xib文件 New File ...

  9. [一]初识Json

    JSON 对象{ "name":"张三" , "age":22}JSON 数组{"student": [{ " ...

  10. .Net Core静态文件中间件StaticFiles的使用

    以前,当我们的网站需要显示图片的时候,直接在网站目录下新建文件夹,把图片放在这个文件夹下,然后通过文件夹的路径就可以访问到. 但是在.net core中不可以这样,要通过中间件StaticFiles配 ...