先定义了一个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. 在Mac上通过Sublime、Skim编辑LaTeX

    转自:http://painterlin.com/2014/08/10/Using-LaTeX-with-Sublime-and-Skim-for-Mac.html Sublime Text是一款非常 ...

  2. hdu5785--Interesting(manacher)

    题意:求给定字符串的三元组(I,J,K)  使得S[i..j] 和 S[j+1..k] 都是回文串.求所有满足条件的三元组 ∑(i*k) 题解:求出以j为结尾的回文串起始位置的和记为lv[j],和以j ...

  3. Android实例-处理隐藏输入法后不再显示问题(XE8+小米2)

    结果: 1.可以处理再次显示问题,但缺点是每个控件都要处理一次,累.哪位大神有好的处理方法,请M我. 实例代码: unit Unit1; interface uses System.SysUtils, ...

  4. delphi 删除目录和创建目录,临时文件夹

    获取用户当前的Windows临时文件夹function GetWinTempPath: string;varTempDir: array[0..255] of char;beginGetTempPat ...

  5. hdoj 2098 分拆素数和

    分拆素数和 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  6. 剑指OFFER之从1到n中出现1的次数(九度OJ1373)

    题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直困扰着他,特此他向JOBDU发来求助信,希望亲们能帮帮他.问题是:求出1~13的整数中1出现的次数,并算出100~130 ...

  7. MFC 学习 之 菜单栏的添加

    运行环境:vc++ 6.0    win81.通过资源 添加一组  菜单栏  如下: 2.在OnInitDialog()中添加如下代码: // Add "About..." men ...

  8. UITableViewcell autolayout下动态高度

    项目中最经常使用的一个UI就是UITableView了.iOS7.8进一步优化了复用机制,用起来相当爽.配合Autolayout,适配工作减轻了非常多. 曾经做适配工作都是在heightForRow里 ...

  9. 【转】linux中的cut/tr/join/split/xargs命令

    1. cut命令 cut命令用于从文件或者标准输入中读取内容并截取每一行的特定部分并送到标准输出. 截取的方式有三种:一是按照字符位置,二是按照字节位置,三是使用一个分隔符将一行分割成多个field, ...

  10. Parse error: syntax error, unexpected T_PUBLIC in 问题解决

    class 类中 public function _getInfo($sn){        $title = '';        $_array = explode('~', $sn);      ...