Node.js Mongoose模型架构引用不起作用

Node.js Mongoose模型架构引用不起作用,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,基本上,我有3个mongoose模型(用户、产品、购物车)。我尝试用用户模型引用购物车模型。我在mongoose中使用了填充方法来填充模型中的引用属性。但它不起作用,在控制台上将产品添加到购物车后,我得到了一个空购物车数组 { "_id": "5a0b2dcf726753258002273d", "password": "12345", "securityQuestion": "What is your Nick Name?", "securityAnswer

基本上,我有3个mongoose模型(用户、产品、购物车)。我尝试用用户模型引用购物车模型。我在mongoose中使用了填充方法来填充模型中的引用属性。但它不起作用,在控制台上将产品添加到购物车后,我得到了一个空购物车数组

  {
    "_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');
            }
            });
         });
       });

您已经正确设置了用户和购物车模型之间的关系,因为用户可能持有对多个购物车模型的引用

但是,在保存购物车时,实际上并没有更新用户的购物车数组/属性。您必须保存您的newCartProduct,还必须将结果id推送到cart数组中,然后保存您的用户模型。如果不这样做,则填充方法将不起作用,因为它没有任何可填充的内容

下面是一个示例,说明如何使用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]
如果您永远不需要在单个用户的上下文之外访问购物车条目(如果您永远不需要跨用户聚合信息),那么这可能是正确的做法


您的方法可能适用于您的用例,但在从购物车添加和删除项目时,您必须手动维护双方的关系。

我已编辑了代码@MikaS。请立即帮助我。为什么填充方法无法更新user中的购物车属性。请参阅上文。这是因为您没有向购物车数组添加值。谢谢!!这是可行的,但是当我推{“cart”:o}即整个cart对象时,也只有objectID被推到usermodel的cart字段中。为什么?因为用户模型上的cart字段可能仍然是:cart:[{type:Schema.Types.ObjectId,ref:'cart'}]阅读我关于将其更改为嵌入式子文档的回答。我知道了。现在,在保存cartproduct后,当我将其重定向到我的购物车产品查看页面时,产品不在那里。但是,当我从应用程序注销并再次登录时,它们会出现。为什么会发生这种情况?