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);
});
mongodb用mongoose取到的对象不能增加属性的更多相关文章
- mongodb用mongoose得到的对象不能增加属性解决
一,先定义了一个goods(商品)的models var mongoose = require('mongoose'); var Schema = mongoose.Schema; var produ ...
- php 给对象动态增加属性 及子类继承父类的构造方法
<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public ...
- mongodb用mongoose查库的对象,不能增加属性
node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...
- mongoDB (mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
MongoDB - 简介 官网:https://www.mongodb.com/ MongoDB 是一个基于分布式文件存储的数据库,由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储 ...
- MongoDB 和 Mongoose 04
一.安装 1. 相关 https://www.mongodb.org/dl/win32/ MongoDB的版本偶数版本为稳定版,奇数版本为开发版 MongoDB对于32位系统支持不佳,所以3.2版本以 ...
- 【重学Node.js 第3篇】mongodb以及mongoose的使用
mongodb以及mongoose的使用 本篇为这个系列的第三篇,想看更多可以直接去github的项目:https://github.com/hellozhangran/happy-egg-serve ...
- 前端知识点回顾——mongodb和mongoose模块
mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条 ...
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...
随机推荐
- vector(相对线程安全) arryList(线程不安全)
1.什么是线程安全? 如果说某个集合是线程安全的,那么我们就不用考虑并发访问这个集合?(需要定义自己百度,但是很难懂) 2.深入jvm中的线程安全的级别. a不变模式(String等基本类型) b.绝 ...
- Java流操作之转换流
流的操作规律: 1.明确流和目的. 数据源(源头):就是需要读取,可以使用两个体系:InputStream.Reader 数据汇(目的地):就是需要写入,可以使用两个体系:OutputStream.W ...
- 第十一章、认识与学习 BASH 数据流重导向
数据流重导向就是将某个命令运行后应该要出现在屏幕上的数据, 给它导向到其他的地方,例如文件或者是装置 (例如打印机之类的)! 什么是数据流重导向 命令运行过程如下: 图 5.1.1.命令运行过程的数据 ...
- [OC Foundation框架 - 22] 集合的内存管理
A.集合的手动内存管理 NSArray addObject: 加入的元素执行一次retain removeObject: 被删除的元素执行一次release removeAllObjects: 所有元 ...
- ScrollView详解
创建方式 1:StoryBoard/Xib 这里StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了! 2:代码: 1 2 3 CGRect bounds = [ ...
- 偶遇mysql外键不好使
原来是创建表时选择的类型不一样,应该是innoDB,而且关联的主表类型也必须是innoDB
- wavecom短信猫常用AT命令
wavecom短信猫常用AT命令 一.一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带 (GSM 900,DCS 1800 或PCS ...
- 剑指OFFER之字符串的排列(九度OJ1369)
题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入: 每个 ...
- Android设计模式系列--原型模式
CV一族,应该很容易理解原型模式的原理,复制,粘贴完后看具体情况是否修改,其实这就是原型模式.从java的角度看,一般使用原型模式有个明显的特点,就是实现cloneable的clone()方法.原型模 ...
- Oracle DataGuard数据备份方案详解
Oracle DataGuard是一种数据库级别的HA方案,最主要功能是冗灾.数据保护.故障恢复等. 在生产数据库的"事务一致性"时,使用生产库的物理全备份(或物理COPY)创建备 ...