zoukankan      html  css  js  c++  java
  • mongoose添加属性问题

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

    项目地址: 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' }) } }) }

     

  • 相关阅读:
    core 3.7.1 报错 SDK.InvalidRegionId : Can not find endpoint to access.
    定时30分钟清除缓存,重置
    文件的分割与合并
    mybatis <collection property="GoodsList" column="orderId" javaType="java.util.List" ofType="ui.model.vo.GoodsList" select="selectOrderDetail" fetchType="eager"/>
    hashMap 源码注释分析(二)
    hashMap 源码注释分析(一)
    ElasticSearch 入门
    Java 三高 ,高并发 ,高可用 。高性能
    使用MyBatis返回map对象,字段值为null时不返回或返回null,目标返回自定义的默认值...
    idea html 中文乱码,控制台中文乱码,工程文件中文乱码
  • 原文地址:https://www.cnblogs.com/ccyinghua/p/8232842.html
Copyright © 2011-2022 走看看