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:添加新的 Schema 属性并更新所有当前文档