MongoDB用Mongoose得到的对象不能增加属性完美解决

作者:计算机专家

生龙活虎,先定义了一个goods的models

在档案的次序中相遇这么二个标题。

var mongoose = require;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

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

var mongoose = require;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规范*/
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);

上述五个models的关系得以阅览:二个客商对应贰个购物车,八个购物车有多少个商品对象

还大概有叁个user顾客模型(models/users.js)

以往我们来为顾客拉长商品===>userDoc为报到后的用户,我们为此顾客的购物车增加商品

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);

我们goods路由中:

现要求依靠good模型中依据货色id获取数据,然后增多到user的购物车列表中,实现投入购物车功用;

Goods.findOne({ productId: productId }, function  { if  { return res.json({ status: "1", msg: err1.message }) } else { if  {//商品 doc.productNum="1", doc.checked="1", userDoc.cartList.push; userDoc.save { if  { return res.json({ status: "1", msg: err2.message }) } else { return res.json({ status: "0", msg: '', result: "suc" }) } }) } } })
// 加入到购物车
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'
                                        })
                                    }
                                })
                            }
                        }
                    })
                }
            }
        }
    })
})

上述符合规律实施后,大家并不以往在客商的购物车中看看productNum和checked, 别的的本性均被赋值。

在从mongodb的数据库的goods表依据货物id获取相应数据,再对此商品数量拉长productNum和checked属性,之后再插入到users表的购物车列表中;发掘users表的购物车列表增多的商品音讯未有那三个特性。

那是干吗吧?

图片 1

因为Mongoose是个ODM (Object Document Mapper),相符于操作关系型数据库使用的ORM(Object Relational Mapper),大家应用Mongoose取到的多寡的结构是要依赖于我们定义的schema结构的。扩张的习性在schema中从未概念,所以大家给goods一时附加productNum和checked属性是不行的。

 图片 2

在那要求证澳优下,便是就算我们给schema附加属性,可是那只是贯彻能真正挂在该schema上,并从未增多到schema中。比如上述的只是想实现在丰盛货品的时候,顺便把productNum和checked的值赋给users表中。我们不用把品质存储到goods中。

 解决办法生龙活虎:

本文由杏彩发布,转载请注明来源

关键词: