基本上我有3个猫鼬模型(用户,产品,购物车)。我尝试用用户模型引用购物车模型。我在mongoose中使用了populate方法来填充模型中引用的属性。但它不起作用,在将产品添加到购物车之后,我就得到了一个空的购物车阵列。
{
"_id": "5a0b2dcf726753258002273d",
"password": "12345",
"securityQuestion": "What is your Nick Name?",
"securityAnswer": "rj1",
"__v": 0,
"cart": [], // empty cart here
"mobileNumber": 1234567890,
"email": "rahul@gmail.com",
"lastName": "jhawar",
"firstName": "rahul",
"userName": "rj"
}
我还想知道我的模型参考是否正确完成(我的意思是关系)。
我对这个概念不熟悉。请帮帮我。
//Cart.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var cartSchema = new Schema({
productName : {type:String,default:''},
productCategory : {type:String,default:''},
productDescription : {type:String,default:''},
productPrice : {type:String,default:''},
sellerName : {type:String,default:''},
});
module.exports=mongoose.model('Cart',cartSchema);
//User.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
userName : {type:String,default:'',required:true},
firstName : {type:String,default:''},
lastName : {type:String,default:''},
email : {type:String,default:''},
mobileNumber : {type:Number,default:''},
password : {type:String},
securityQuestion : {type:String},
securityAnswer : {type:String},
cart : [{
type: Schema.Types.ObjectId,
ref:'Cart'
}]
});
module.exports=mongoose.model('User',userSchema);
///Routes///
const cartRouter = express.Router();
const cartModel = mongoose.model('Cart');
const userModel = mongoose.model('User');
const productModel = mongoose.model('Product');
cartRouter.get('/addtocart/:id',auth.checkLogin,(req,res)=>{
productModel.findOne({'_id':req.params.id},(err,foundProduct)=>{
if(!err){
const newCartProduct = new cartModel({
productName : foundProduct.productName,
productCategory : foundProduct.productCategory,
productDescription : foundProduct.productDescription,
productPrice : foundProduct.productPrice,
sellerName : foundProduct.sellerName
});
newCartProduct.save((err)=>{
if(!err){
userModel.findOne({'_id':req.session.user._id}).populate('cart')
. exec((err,cartproduct)=>{
console.log(JSON.stringify(cartproduct, null, "\t"));
});
console.log('New Product added to cart');
res.redirect('/users/cart_products');
}
});
});
});
答案 0 :(得分:0)
您已正确设置用户与购物车模型之间的关系,因为用户可能会拥有对多种购物车型号的引用。
但是,当您保存购物车时,您实际上并未更新用户的购物车数组/属性。您必须同时保存newCartProduct,并且还必须将结果ID推送到购物车阵列,然后保存您的用户模型。如果你不这样做,填充方法就不会起作用,因为它没有任何东西可以填充。
以下是如何使用findByIdandUpdate使用新购物车项目更新用户的示例。
cartRouter.get('/addtocart/:id',auth.checkLogin,(req,res)=>{
productModel.findOne({'_id':req.params.id},(err,foundProduct)=>{
if(!err){
const newCartProduct = new cartModel({
productName : foundProduct.productName,
productCategory : foundProduct.productCategory,
productDescription : foundProduct.productDescription,
productPrice : foundProduct.productPrice,
sellerName : foundProduct.sellerName
});
newCartProduct.save((err, o)=>{
if(!err){
userModel.findByIdAndUpdate(req.session.user._id,
{$push: {"cart": o._id}},
{safe: true, new : true})
.populate('cart')
.exec((err, model) => {
console.log(model); //This will have the cart array filled in
});
});
});
其他选择是反转关系,挂起用户对购物车的引用,或者使用嵌入式子文档:
cart: [Cart]
如果您永远不需要访问单个用户的上下文之外的购物车条目(如果您从不需要跨用户的汇总信息),那么它可能是正确的。
您的方法可能适用于您的用例,但是当您添加商品并将其从购物车中移除时,您必须手动维护关系的两面。