在项目中遇到这样一个问题。

项目地址: https://github.com/ccyinghua/vue-node-mongodb-project/blob/master/07-shoppingCart.md

有一个good商品模型(models/goods.js)

var mongoose = require('mongoose');
var Schema = mongoose.Schema; // 定义一个Schema
var produtSchema = new Schema({
'productId':String, // 或者 'productId':{type:String}
'productName':String,
'salePrice':Number,
'productImage':String
}) // 输出(导出)
module.exports = mongoose.model('good',produtSchema);

还有一个user用户模型(models/users.js)

var mongoose = require('mongoose');
var Schema = mongoose.Schema; // 定义一个Schema
var userSchema = new Schema({
'userId':String, // 或者 'userId':{type:String}
'userName':String,
'userPwd':String,
'orderList':Array,
'cartList':[ // 购物车列表
{
"productId":String,
"productName":String,
"salePrice":Number,
"productImage":String,
"checked":String, // 是否选中
"productNum":String // 商品数量
}
],
"addressList":Array
}) // 输出(导出)
module.exports = mongoose.model('user',userSchema);

现需要根据good模型中根据商品id获取数据,然后添加到user的购物车列表中,实现加入购物车功能;

// 加入到购物车
var Goods = require('../models/goods');
var User = require('../models/users.js'); // 引入user模型
router.post("/addCart",function(req, res, next){
var userId = '100000077',
productId = req.body.productId; // post请求拿到res参数:req.body // 查询第一条:拿到用户信息
User.findOne({
userId:userId // 查询条件
},function(err,userDoc){
if(err){
res.json({
status:"1",
msg:err.message
})
}else{
console.log("userDoc"+userDoc); // 用户数据
if(userDoc){
let goodsItem = '';
userDoc.cartList.forEach(function(item){ // 遍历用户购物车,判断加入购物车的商品是否已经存在
if(item.productId == productId){
goodsItem = item;
item.productNum++; // 购物车这件商品数量+1
}
})
if(goodsItem){ // 若购物车商品已存在
userDoc.save(function (err2,doc2) {
if(err2){
res.json({
status:"1",
msg:err2.message
})
}else{
res.json({
status:'0',
msg:'',
result:'suc'
})
}
})
}else{ // 若购物车商品不存在,就添加进去
Goods.findOne({productId:productId},function(err1,doc){ // 从商品列表页Goods查询点击加入购物车的那件商品信息
if(err1){
res.json({
status:"1",
msg:err1.message
})
}else{
if(doc){
doc.productNum = 1;
doc.checked = 1;
userDoc.cartList.push(doc); // 添加信息到用户购物车列表中
userDoc.save(function(err2,doc2){ // 保存数据库
if(err2){
res.json({
status:"1",
msg:err2.message
})
}else{
res.json({
status:"0",
msg:'',
result:'suc'
})
}
})
}
}
})
}
}
}
})
})

在从mongodb的数据库的goods表根据商品id获取对应数据,再对此商品数据添加productNum和checked属性,之后再插入到users表的购物车列表中;发现users表的购物车列表添加的商品信息没有这两个属性。

 解决办法一:

在good模型内添加属性是要在Schema添加这两个属性的;使用Mongoose取到的数据的结构是要依赖于定义的schema结构的。虽然我们给schema附加属性,但是这只是实现能真正挂在该schema上,并没有添加到schema中。

var mongoose = require('mongoose');
var Schema = mongoose.Schema; // 定义一个Schema
var produtSchema = new Schema({
'productId':String, // 或者 'productId':{type:String}
'productName':String,
'salePrice':Number,
'productImage':String, // 添加的属性
"checked":String,
"productNum":Number
}) // 输出(导出)
module.exports = mongoose.model('good',produtSchema);

 解决办法二:

新建一个对象,对象包含商品信息,添加到购物车列表。

var obj = null;
if(doc){
obj = {
productId: doc.productId,
producName: doc.producName,
salePrice: doc.salePrice,
productName: doc.productName,
productImage: doc.productImage,
productNum: 1,
checked: "1"
}
userDoc.cartList.push(obj); // 添加信息到用户购物车列表中 userDoc.save(function(err2,doc2){ // 保存数据库
if(err2){
res.json({
status:"1",
msg:err2.message
})
}else{
res.json({
status:"0",
msg:'',
result:'suc'
})
}
})
}

mongoose添加属性问题的更多相关文章

  1. runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...

  2. JS Div滚动,下拉框添加属性,年月日下拉条

    创建某一下拉菜单的项: str = str+"<option value='"+i+"'>"+i+"</option>&quo ...

  3. ios动态添加属性的几种方法

    http://blog.csdn.net/shengyumojian/article/details/44919695 在ios运行过程中,有几种方式能够动态的添加属性. 1-通过runtime动态关 ...

  4. MVC @Html.TextBox 添加属性和样式

    1.添加属性:@Html.TextBox("CnAddressmodify","", new { maxlength="90" }) 2.添 ...

  5. Runtime(动态添加属性)

    下面通过一个实例展示一下Runtime(动态添加属性)的用法 下面对运行时添加属性用到的策略参数进行补充: 这样看来,前面的NSString* name用的策略是retain nonatomic就知道 ...

  6. 通过运行时动态给OC分类添加属性

    #import <UIKit/UIKit.h> /** iOS 开发中,分类默认不允许保存属性 如果在分类中,定义一个属性,需要自己实现 getter & setter 方法,而且 ...

  7. 给分类(Category)添加属性

    遇到一个问题,写了一个分类,但原先类的属性不够用.添加一个属性,调用的时候崩溃了,说是找不到getter.setter方法.查了下文档发现,OC的分类允许给分类添加属性,但不会自动生成getter.s ...

  8. 如何遍历json属性和动态添加属性

    var person= { name: 'zhangsan', pass: '123' , 'sni.ni' : 'sss', hello:function (){ for(var i=0;i< ...

  9. 在C#中使用属性控件添加属性窗口

    转自原文 在C#中使用属性控件添加属性窗口 第一步,创建在应用程序中将要展现的字段属性为public公有属性.其中,所有的属性必须有get和set的方法(如果不设置get方法,则要显示的属性不会显示在 ...

随机推荐

  1. 在线作图工具 Flowchart Maker & Online Diagram Software & Visual Solution

    9款国内外垂直领域的在线作图工具:那些可以替代Visio的应用!-CSDN.NEThttps://www.csdn.net/article/2015-02-12/2823939 Documentsht ...

  2. Forward链、Input链和Output链的区别

    转载自:http://blog.chinaunix.net/uid-27863080-id-3442374.html 1. 如果数据包的目的地址是本机,则系统将数据包送往Input链.如果通过规则检查 ...

  3. vscode 注册表

    Windows Registry Editor Version 5.00 ; Open files [HKEY_CLASSES_ROOT\*\shell\Open with VS Code] @=&q ...

  4. PHP的魔术常量

    PHP的魔术常量(变量).魔术方法(函数).超全局变量 一.魔术常量(魔术变量) 概念:所谓的魔术常量就是PHP预定义的一些常量,这些常量会随着所在的位置而变化. 1.__LINE__  获取文件中的 ...

  5. Socket通信客户端和服务端代码

    这两天研究了下Socket通信,简单实现的客户端和服务端代码 先上winfrom图片,客户端和服务端一样 服务端代码: using System; using System.Collections.G ...

  6. @Value("#{}")与@Value("${}")的区别

    原文:https://blog.csdn.net/u012925172/article/details/84926064 @Value("#{}")   SpEL表达式@Value ...

  7. element -validateField校验提示

    <el-form :model="numberValidateForm" ref="numberValidateForm" :rules="ru ...

  8. str 操作方法

    # str 类,字符串 # name ='alex' # 首字母变大写 # test ='alex' # v= test.capitalize() # print(v) # # 大写全部变小写 # t ...

  9. maya2013无法安装卸载激活失败

    AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...

  10. MySQL · 引擎特性 · InnoDB index lock前世今生

    http://mysql.taobao.org/monthly/2015/07/05/ MySQL · 引擎特性 · InnoDB index lock前世今生 前言 InnoDB并发过程中使用两类锁 ...