先定义了一个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. spring data mongodb中,如果对象中的属性不想加入到数据库字段中

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

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

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

  8. JS中构造函数与原型对象的同名属性,实例会取哪一个

    构造函数与原型对象的同名属性,实例会取哪一个? 看了下面的过程,再回忆JS高程3里关于这部分的示意图.实例my在new的时候,本身就获得了a属性,所以my.a是1,倘若在new的时候如果没有赋予a属性 ...

  9. asp.net中C#对象与方法 属性详解

    C#对象与方法 一.相关概念: 1.对象:现实世界中的实体 2. 类:具有相似属性和方法的对象的集合 3.面向对象程序设计的特点:封装  继承 多态 二.类的定义与语法 1.定义类: 修饰符 类名称 ...

随机推荐

  1. Qt之图形视图框架

    简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支 ...

  2. Android Clipboard(复制/剪贴板)

    Android提供的剪贴板框架,复制和粘贴不同类型的数据.数据可以是文本,图像,二进制流数据或其它复杂的数据类型. Android提供ClipboardManager.ClipData.Item和Cl ...

  3. PAT (Advanced Level) 1083. List Grades (25)

    简单排序. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  4. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  5. java 代码

    java 里的 pandas tablesaw DataFrame 再有就是 spark 了 java 代码规范 Java8特性详解 lambda表达式 Stream Sonar 规则检测 sprin ...

  6. 如何解压DMK固件

    一.DMK固件 从罗克韦尔自动化下载的固件通常是以DMK为后缀名的文件: DMK文件无法直接使用,需要使用DMK Extraction Tool解压: 二.方法步骤 1.  如果从官网下载的固件文件后 ...

  7. prim算法和克鲁斯卡尔算法

    Prim 设图G=(V,E)是一个具有n个顶点的连通网,其生成树的顶点集合为U.首先把v0放入U,再在所有的u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树,并把该边的v加入U集合 ...

  8. 2018.12.21 浪在ACM 集训队第十次测试赛

     浪在ACM 集训队第十次测试赛 A Diverse Substring B Vasya and Books C Birthday D LCM A 传送门 题解 B 传送门 题解: 这道题,就比较简单 ...

  9. ansible 批量推送公钥

    这里我们使用ansible的playbook 的功能来推送秘钥 使用方法参见:http://blog.csdn.net/magedu_linux/article/details/48529645 这里 ...

  10. c++ primer读书笔记之c++11(二)

    1 新的STL模板类型,std::initializer_list<T> c++11添加了initializer_list模板类型,用于提供参数是同类型情况的可变长度的参数传递机制,头文件 ...