Node.js Mongoose模型架构引用不起作用
基本上,我有3个mongoose模型(用户、产品、购物车)。我尝试用用户模型引用购物车模型。我在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
{
"_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后,当我将其重定向到我的购物车产品查看页面时,产品不在那里。但是,当我从应用程序注销并再次登录时,它们会出现。为什么会发生这种情况?