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

项目地址: 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. windwos-sshfs

    从 http://www.jianshu.com/p/d79901794e3d 转载 目的 最近因为需要在linux虚拟机里进行开发程序,虽然在linux里有超强的编辑器vim,但vim开发html前 ...

  2. 邮件服务器启动postfix时的问题:master 已死,但 pid 文件仍存

    [root@linux115 ~]# service postfix restart  // 重启postfix关闭 postfix:[失败]  启动 postfix: [确定][root@linux ...

  3. JAVA第一个程序hello world

    import java.util.Scanner; public class hello { public static void main(String[] args) { System.out.p ...

  4. thinkPHP5.0使用form表单提交数据和删除文章,不用TP的提示页面,使用弹出提示信息

    form表单提交数据和删除文章时,TP的默认信息提示页面的看起来不是很好看,想要实现弹窗提示怎么做呢? 前端:可以使用前端的一个知识--iframe,iframe元素会创建包含另外一个文档的内联框架: ...

  5. eclipse 分屏显示同一文件

    某个类很大,可能有数千行.当你想要将类开头部分与中间或者靠后的部分进行对比时,请follow如下步骤: Window -> Editor -> Toggle Split Editor (C ...

  6. Django重新整理2

    Auth认证: 1.分配路由和创建视图函数 2.在视图函数中引用Django为我们提供的用户认证组建Auth 3.直接进行判断: def login(request): if request.meth ...

  7. Neutron命令测试5

    jolin@jolin:/$ route -nKernel IP routing tableDestination Gateway Genmask Flags Metric Ref Use Iface ...

  8. Murano Setup Steps

    1. Select a Linux Distribution Only Ubuntu 14.04 (Trusty), Fedora 21 (or Fedora 22) and CentOS/RHEL ...

  9. python函数(四)

    一.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序),在Pasc ...

  10. 关于Vim 的插件snipmate 以及它的安装方式

    在网上看了http://study.163.com/course/courseMain.htm?courseId=269016#/courseMain   里关于snipmate 的视频 snipma ...