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/ ...
随机推荐
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- 嵌入式开发应该掌握的一些Linux命令
Linux提供了大量的命令,利用它可以有效地完成大量的工作,如磁盘操作.文件存取.目录操作.进程管理.文件权限设定等.所以,在Linux系统上工作离不开使用系统提供的命令.要想真正理解Linux系统, ...
- HDU2015校赛 The Country List
今天手感真差..各种读错题意.水题... 就是说,给你几个串.如果长度一样并且相同位置字符相同(不分大小写)的个数大于两个就是不同串. #include<iostream> #includ ...
- hdu4812-D Tree (树的点分治)
昨天学了下树分治,今天补这道题,还是太不熟练了,写完之后一直超时.后来查出好多错= =比如v,u写倒了,比如+写成了取最值,比如....爆int...查了两个多小时的错..哭...(没想到进首页了 h ...
- 44 个 JavaScript 变态题解析
当初笔者做这套题的时候不仅怀疑智商, 连人生都开始怀疑了…. 不过, 对于基础知识的理解是深入编程的前提. 让我们一起来看看这些变态题到底变态不变态吧! 第1题 ["1", &qu ...
- Java之字节输入流和输出流
package IODemo; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOEx ...
- [iOS基础控件 - 5.1] UIScrollView
A.需要掌握 UIScrollView 是一个能够滚动的视图控件,可以用来展示大量内容,如手机的“设置” 1.常见属性 2.常用代理方法 3.缩放 4.UIScrollView和UIPageContr ...
- 你的iOS静态库该减肥了
我有点震惊,国内的具有极少的有关静态库开发的内容,除了一些简单的如何教你开发,而且是原创还是copy,谁知道呢?细思极恐,不扯那么远了,这里就已切身的爬坑经历提供几个静态库瘦身的方案. 公司最近开发完 ...
- HBase in 2013
2013年马上就要过去了,总结下这一年HBase在这么一年中发生的主要变化.影响最大的事件就是HBase 0.96的发布,代码结构已经按照模块化release了,而且提供了许多大家迫切需求的特点.这些 ...
- 教你50招提升ASP.NET性能(二):移除不用的视图引擎
(2)Remove unused View Engines 招数2: 移除不用的视图引擎 If you're an ASP.NET MVC developer, you might not know ...