Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 我可以在mongoose上加载文档后填充更多字段吗?_Node.js_Mongodb_Express_Mongoose - Fatal编程技术网

Node.js 我可以在mongoose上加载文档后填充更多字段吗?

Node.js 我可以在mongoose上加载文档后填充更多字段吗?,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我想在加载一个文档后填充传统字段 我正在将我的购物车装载到我正在构建的电子商务上,在所有路线上都是这样: 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){

我想在加载一个文档后填充传统字段

我正在将我的购物车装载到我正在构建的电子商务上,在所有路线上都是这样:

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 },
});
我知道我可以根据我在不同页面字段上的需要,在更多的中间件中进行分解,或者重新加载购物车,我也可以通过两个数组,重新加载的产品和加载到购物车上的产品进行某种合并,但我想mongoose可能有办法做到这一点。

你不能“
重新填充
”一个
填充的字段

用一个简单的
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) {
      // ...
    })
});

这实际上可以做到:

因此,在这种特定的情况下,我需要将这段代码添加到希望cart填充更多字段的函数中,而中间件不需要任何更改

带回调的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();

你想要这个吗?或者你的意思是什么?说明和插件字段在哪里?不,我已经在使用填充:“.populate({path:“products.product”,选择:“price name photos slug”})“我想做的是填充更多字段,稍后当我已经加载文档时,为什么不从一开始填充它们?如果以后想获得更多数据,可以根据产品id进行选择。因为我只需要20+中的2页上的那些额外字段,而且它们有点大,我想将其分成不同的中间件更有意义,因为我没有一个简单的参数可以在if上使用。无论如何,我选择你的答案是因为你回答我不能做我想做的事。