在我已经在mongoose上加载文档后,我可以填充更多字段吗?

时间:2016-12-20 20:17:46

标签: node.js mongodb express mongoose

我想在加载一个文档后填充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 },
});

我知道我可以在更多的中间件中根据我对不同页面上的字段的需求,或者重新加载购物车来解决这个问题,我也可以通过两个阵列,我重新加载的产品和我加载的产品购物车并进行某种合并,但我认为猫鼬可能有某种方法可以做到这一点。

2 个答案:

答案 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();