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/ ...
随机推荐
- 嵌入式开发应该掌握的一些Linux命令
Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...
- 在linux上通过JDBC连接ORACLE 时总是出现 java.sql.SQLRecoverableException: IO Error: Connection reset 的问题
如标题所述,经过和度娘沟通了不知道多少遍最后看一篇文章解决, 我是通过执行jar来操作DB的.所以在命令中加了一个参数( 加粗,红色) eg: $JAVA_EXE -Djava.security.eg ...
- uvalive 4973 Ardenia
题意:给出空间两条线段,求距离. 注意输出格式! #include<cstdio> #include<cmath> #include<algorithm> usin ...
- Linux内核,文件系统移植过程中出现的一些问题与解决办法
1.bootm地址和load address一样 此种情况下,bootm不会对uImage header后的zImage进行memory move的动作,而会直接go到entry point开始执行. ...
- JAVA面试题——JAVA基础篇
1.JAVA多态的实现方式:继承.重载.覆盖 2.JAVA有8种基本数据类型:byte.short.int.long.float.double.boolean.char 3.final.finally ...
- HDU-4618 Palindrome Sub-Array 暴力枚举
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4618 直接暴力枚举中心点,在中间如果求不出最大值直接跳过优化下... //STATUS:C++_AC_ ...
- Java网络编程(URL&URLConnection)
package cn.itcast.net.p2.ie_server; import java.io.IOException; import java.io.InputStream; import j ...
- 最简单的计算MD5方法
原来写过一个计算MD5的程序,是用了一个叫MD5.pas的单元,使用起来还算简单,但还有更简单的办法,安装了indy就会有IdHashMessageDigest单元(delphi 7默认安装indy) ...
- java泛型 8 泛型的内部原理:类型擦除以及类型擦除带来的问题
参考:java核心技术 一.Java泛型的实现方法:类型擦除 前面已经说了,Java的泛型是伪泛型.为什么说Java的泛型是伪泛型呢?因为,在编译期间,所有的泛型信息都会被擦除掉.正确理解泛型概念的首 ...
- delete table 和 truncate table
delete table 和 truncate table 使用delete语句删除数据的一般语法格式: delete [from] {table_name.view_name} [where< ...