我有一个Cart
架构,如下所示:
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const cartSchema = new Schema({
items:[
{
id:{
type:Schema.Types.ObjectId,
ref:'Post'
},
quantity:Number
}
]
});
该模式引用_id
数组中另一个Post
模式的items
以及购物车中该项目的数量。我对Cart
的find语句包括一个populate()
方法调用,该方法调用从理论上引入了实际的Post
项目,因此我可以在页面上显示标题等:
let cart;
if(!req.session.cartId) {
req.session.error = 'There are no items currently in your cart';
return res.redirect('/');
}
try {
cart = await Cart.findById(req.session.cartId).populate({
path:'item',
model:'Post'
}).exec();
省去catch
块,因为我不认为这是问题的一部分。
我应该可以看到Post
文档代替它的ObjectId
,并且我已经能够在其他地方执行类似的操作。
该语句运行并返回购物车,但是似乎populate()
调用被忽略了,而我得到的只是带有items
和{{1的_id
数组}}值与我最初存储的值完全相同:
quantity
但是,我看到的关于cart: {
_id: 5e6e884ffda1be0648ae1b99,
items: [ { _id: 5e3435f9ab899a1dd8a4105e, quantity: 1 } ],
__v: 1
}
的所有内容都只存储了对当前(购物车)文档中外来(post)文档的Mongoose.populate()
的引用{em}不含ObjectId
的其他属性。那是什么引起我的麻烦?如果是这样,如何链接quantity
中Post
中items
的数量?
答案 0 :(得分:1)
您的填充不正确。
您的路径必须是items.id
而不是item
,并且模型必须是实际模型,而不是字符串,因此,请删除单引号,并确保将其导入为const Post = require("../models/post");
cart = await Cart.findById(req.session.cartId).populate({
path:'items.id',
model:Post
}).exec();
这将为您提供如下结果:
{
"_id": "5e6f2dd63d82e35988921907",
"items": [
{
"_id": "5e6f2dd63d82e35988921909",
"id": {
"_id": "5e6f2da53d82e35988921905",
"title": "Post 1 Title",
"__v": 0
},
"quantity": 1
},
{
"_id": "5e6f2dd63d82e35988921908",
"id": {
"_id": "5e6f2db13d82e35988921906",
"title": "Post 2 Title",
"__v": 0
},
"quantity": 2
}
],
"__v": 0
}
由于id字段,结果看起来有点难看,不容易阅读。
因此,我建议您像这样将items.id
字段重命名为items.post
:
const cartSchema = new Schema({
items: [
{
post: {
type: Schema.Types.ObjectId,
ref: "Post"
},
quantity: Number
}
]
});
然后将填充路径更改为items.post
,以使结果如下所示:
{
"_id": "5e6f2dd63d82e35988921907",
"items": [
{
"_id": "5e6f2dd63d82e35988921909",
"post": {
"_id": "5e6f2da53d82e35988921905",
"title": "Post 1 Title",
"__v": 0
},
"quantity": 1
},
{
"_id": "5e6f2dd63d82e35988921908",
"post": {
"_id": "5e6f2db13d82e35988921906",
"title": "Post 2 Title",
"__v": 0
},
"quantity": 2
}
],
"__v": 0
}