Mongoose模型架构引用不起作用

时间:2017-12-03 18:03:12

标签: node.js mongodb mongoose

基本上我有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');
            }
            });
         });
       });

1 个答案:

答案 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]

如果您永远不需要访问单个用户的上下文之外的购物车条目(如果您从不需要跨用户的汇总信息),那么它可能是正确的。

您的方法可能适用于您的用例,但是当您添加商品并将其从购物车中移除时,您必须手动维护关系的两面。