mongodb用mongoose得到的对象不能增加属性解决
一,先定义了一个goods(商品)的models
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var productSchema = new Schema({
"productId":String,
"producName": String,
"salePrice":Number,
"productImage":String
});
module.exports=mongoose.model("Good",productSchema,'goods');
二,在定义一个users(用户)的models
var mongoose = require('mongoose');
var userSchema = new mongoose.Schema({
"userId": String,
"userName": String,
"userPwd": String,
"orderList": Array,
"cartList": [
{
"productId":String,
"producName": String,
"salePrice":Number,
"productName": String,
"productImage": String,
"checked": String,
"productNum": String
}
],
"addressList": Array
});
module.exports = mongoose.model("User", userSchema, 'users')
/*commonjs规范*/
上述两个models的关系可以看出:一个用户对应一个购物车(cartList),一个购物车有多个商品对象
现在我们来为用户添加商品(我们默认是可以直接添加的)===>userDoc为登录后的用户,我们为此用户的购物车添加商品
我们goods路由中:
Goods.findOne({
productId: productId
}, function (err1, doc) {
if (err1) {
return res.json({
status: "",
msg: err1.message
})
} else {
if (doc) {//商品
doc.productNum="",
doc.checked="",
userDoc.cartList.push(doc);
userDoc.save(function (err2) {
if (err2) {
return res.json({
status: "",
msg: err2.message
})
} else {
return res.json({
status: "",
msg: '',
result: "suc"
})
}
})
}
}
})
上述正常执行后,我们并没有在用户的购物车中看到productNum和checked, 其余的属性均被赋值。
这是为什么呢?
因为Mongoose是個ODM (Object Document Mapper),类似于操作关系型数据库使用的ORM(Object Relational Mapper),我们使用Mongoose取到的数据的结构是要依赖于我们定义的schema结构的。增加的属性在(goods)schema中没有定义,所以我们给goods临时附加productNum和checked属性是无效的。
在这里需要说明一下,就是虽然我们给schema附加属性,但是这只是实现能真正挂在该schema上,并没有添加到schema中。比如上述的只是想实现在添加商品的时候,顺便把productNum和checked的值赋给users表中。我们无须把属性存储到goods中。
结论:mongodb中使用mongoose取到的对象不能增加属性。
解决方法一,
在schema中直接增加需要补充的属性。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var productSchema = new Schema({
"productId":String,
"producName": String,
"salePrice":Number,
"productImage":String
"checked": String,
"productNum": String
});
module.exports=mongoose.model("Good",productSchema,'goods');
这样两边可以对等实现,赋值。(有时候不是很好)
解决方法二,
把查询到的结果clone一个对象,然后在新对象中补充属性。
Goods.findOne({productId: productId}, function (err1, doc) {
var newobj = null;//新对象
if (err1) {
return res.json({
status: "",
msg: err1.message
})
} else {
if (doc) {//商品
newobj = {//新创建一个对象,实现转换mongoose不能直接增加属性的坑
productNum: "",
checked: "",
productId: doc.productId,
producName: doc.producName,
salePrice: doc.salePrice,
productName: doc.productName,
productImage: doc.productImage,
}
userDoc.cartList.push(newobj);
userDoc.save(function (err2) {
if (err2) {
return res.json({
status: "",
msg: err2.message
})
} else {
return res.json({
status: "",
msg: '',
result: "suc"
})
}
})
}
}
})
执行之后,我们可以看到mongodb数据中的users表的procuctNum和checked被赋值。
这个只是简单的记录一下在学习过程中遇到的一些不太顺的小坑。
有问题可以留言一起讨论。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
mongodb用mongoose得到的对象不能增加属性解决的更多相关文章
- mongodb用mongoose取到的对象不能增加属性
先定义了一个article的schema var mongoose = require('mongoose'); var Schema = mongoose.Schema; exports.schem ...
- mongodb用mongoose查库的对象,不能增加属性
node + koa2 + mongodb 写了一个给前端的接口 如果不是写这个接口,这辈子都发现不了mongodb里这个大坑 mongoose 是个ODM(Object Document Mappe ...
- php 给对象动态增加属性 及子类继承父类的构造方法
<?php error_reporting(-1); ini_set('display_errors','on'); class A { public $a = 'hello'; public ...
- 前端笔记之NodeJS(四)MongoDB数据库&Mongoose&自制接口&MVC架构思想|实战
一.MongoDB数据库 1.1 NoSQL简介 随着互联网web2.0网站的兴起,传统的SQL数据库(关系数据库)在应付web2.0网站,特别是超大规模和高并发的SNS(social network ...
- 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版本以 ...
- [转] mongoDB与mongoose
mongoDB简介 mongoDB与一些关系型数据库相比,它更显得轻巧.灵活,非常适合在数据规模很大.事务性不强的场合下使用.同时它也是一个对象数据库,没有表.行等概念,也没有固定的模式和结构,所有的 ...
- Practical Node.js (2018版) 第5章:数据库 使用MongoDB和Mongoose,或者node.js的native驱动。
Persistence with MongoDB and Mongoose https://github.com/azat-co/practicalnode/blob/master/chapter5/ ...
- Node.js开发——MongoDB与Mongoose
为了保存网站的用户数据和业务数据,通常需要一个数据库.MongoDB和Node.js特别般配,因为MongoDB是基于文档的非关系型数据库,文档是按BSON(JSON的轻量化二进制格式)存储的,增删改 ...
随机推荐
- vs2010下创建webservice ----第一天(建立项目,以及不连数据库进行加减乘除)
Visual Studio 2010默认采用的框架为.NET Framework4,在这个框架中已找不到直接创建WebService的模板方式了.但VS2010可以创建WebService是毋庸置疑的 ...
- 【转】nodejs mysql 链接数据库集群
1.建立数据库连接:createConnection(Object)方法 该方法接受一个对象作为参数,该对象有四个常用的属性host,user,password,database.与php中 ...
- Spring初学之通过工厂方法配置Bean
工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...
- Flume-NG源码阅读之HDFSEventSink
HDFSEventSink是flume中一个很重要的sink,配置文件中type=hdfs.与此sink相关的类都在org.apache.flume.sink.hdfs包中. HDFSEventSin ...
- poj 2116 Death to Binary? 模拟
Death to Binary? Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1707 Accepted: 529 D ...
- tp5 数据库Db增删改操作
添加数据insert $data = [ 'name_cn' => '张三', 'name_en' => 'jack', ]; $res = Db::name('style')->i ...
- 184. Department Highest Salary
问题描述 解决方案 select b.Name Department,a.Name Employee,a.Salary from ( select e1.Salary,e1.Name,e1.Depar ...
- Swift 3.0 on Ubuntu 15.10
一.安装swift 3.0 1. 下载 https://swift.org/download/ 找到swift-3.0 ubuntu 15.10版本下载: https://swift.org/buil ...
- VMware设置NAT网络及 CentOS 7IP配置
1.打开VMware,选择 编辑, 虚拟网络编辑器 2.默认情况下,VMware8为我们NAT所使用的网卡,选中VMnet8 3.此处设置我们的IP地址,这个随便指定,我这里设置成192.168.2 ...
- Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!
转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop ...