我想在加载一个文档后填充aditional字段。
我在我正在建设的电子商务中加载我的购物车,就像在所有路线上一样:
app.use(function(req, res, next) {
Cart.findOne({session: req.cookies['express:sess']})
.populate({ path: "products.product", select: "price name photos slug" })
.exec(function(err, cart){
if(err){
return err; //TODO: PAG 500
}
if(cart){
res.locals.cart = cart;
} else {
res.locals.cart = new Cart({ session: req.cookies['express:sess']});
}
next();
});
});
但是在一个页面上,我想要从产品中加载更多字段描述和插件。 我试图加载产品,但后来我错过了购物车上数量的相关信息
var CartSchema = new Schema({
products: [{
product: { type: Schema.ObjectId, ref : 'Product' },
quantity: { type: Number, default: 1}
}],
totalItems: { type: Number, default: 0},
message: { type: String },
});
我知道我可以在更多的中间件中根据我对不同页面上的字段的需求,或者重新加载购物车来解决这个问题,我也可以通过两个阵列,我重新加载的产品和我加载的产品购物车并进行某种合并,但我认为猫鼬可能有某种方法可以做到这一点。
答案 0 :(得分:0)
你不能" re-populate
" populated field
。
如何使用简单的if
来确定要填充的字段。例如:
app.use(function(req, res, next) {
var productSelect;
// This is just an example, you can get the condition from params, body, header..
if (req.body.isMoreField) {
productSelect = 'add more field in here';
}
else {
productSelect = 'less field here';
}
Cart
.findOne({
// ...
})
.populate({
// ...
select: productSelect,
// ...
})
.exec()
.then(function(cart) {
// ...
})
});
答案 1 :(得分:0)
这实际上可以做到:
https://mongoosejs.com/docs/api.html#document_Document-populate
因此,在这种特定情况下,我需要将这段代码添加到想要添加更多字段的购物车的函数中,并且中间件不需要任何更改
带有回调的ES5:
var populate = [
{ path: "products.product", select: "price name photos slug" },
{ path: "card", select: "price name photo"}
];
var cart = res.locals.cart;
cart.populate(populate, function(err, populatedCart) {
res.locals.cart = populatedCart;
next();
});
使用ES6:
const populate = [
{ path: "products.product", select: "price name photos slug" },
{ path: "card", select: "price name photo"}
];
res.locals.cart = await res.locals.cart.populate(populate).execPopulate();