mongoose添加属性问题

Posted ccyinghua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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\' }) } }) }

 

 

以上是关于mongoose添加属性问题的主要内容,如果未能解决你的问题,请参考以下文章

mongoose添加属性问题

Mongoose:添加新的 Schema 属性并更新所有当前文档

Mongoose:添加新的 Schema 属性并更新所有当前文档

mongoose 给文档的子数组的头部插入数据

如何在 Mongoose 中为模式属性添加选项?

从 Mongoose Find() 查询向对象数组添加属性 [重复]