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的轻量化二进制格式)存储的,增删改 ...
随机推荐
- 在eclipse中使用Github进行单元测试
时间分配是找资料60%,动手实践40%.因为之前一直没怎么好好学习,导致看到使用Gunit进行单元测试的时候感觉像是看到了一行符号一样不知所措,还好现在搜索引擎很强大,找资料学习中间有找到一个现成的傻 ...
- 安装rackspace private cloud --5 Deployment configuration
运行Ansible playbooks之前,需要配置taget host Prerequisites . cp -r /opt/openstack-ansible/etc/openstack_depl ...
- hibernate学习(1)
对象的持久化 狭义的理解,“持久化”仅仅指把对象永久保存到数据库中 广义的理解,“持久化”包括和数据库相关的各种操作 -保存:把对象永久保存到数据库中 -更新:更新数据库中对象的状态 -删除:从数据库 ...
- poj2135最小费用流
裸题,就是存个模板 最小费用流是用spfa求解的,目的是方便求解负环,spfa类似于最大流中的bfs过程 #include<map> #include<set> #includ ...
- 详解 Android 通信
详解 Android 通信 :http://www.androidchina.net/5028.html
- count(*) 和count(1) 有区别吗
create table test1 (a varchar2(2),b varchar2(2)); insert into test1 values ('b','c'); insert into te ...
- 遍历Newtonsoft.Json.Linq.JObject
JObject 遍历: 引用命名空间:using Newtonsoft.Json.Linq; JObject _jObject = JObject.Parse("{'ID':'001','M ...
- PHP用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID
向mysql 插入数据时,很多时候我们想知道刚刚插入数据的id,这对我们很有用.下面这篇文章就详细给大家介绍了利用mysql_insert_id()函数获得刚插入数据或当前发布文章的ID,有需要的朋友 ...
- python 字符串大小写相关函数
改写:(都不会改变原字符串) s = 'hEllo wOrld' s Out[3]: 'hEllo wOrld' s.upper()#全部大写 Out[4]: 'HELLO WORLD' s Out[ ...
- Boost 读写锁
//#########测试多线程,读写锁,递归锁 #include <boost/thread.hpp> #include <boost/thread/recursive_mutex ...