Mongoose条件填充

yptwkmov  于 2023-04-12  发布在  Go
关注(0)|答案(1)|浏览(146)

我有这样一段代码,我想得到待处理的发票,我只想得到客户端和金额字段。

const query = {status:"pending"};
const fields = "amount client";

const invoices = await Invoice.find(query,fields)
      .populate({model: 'User',path: 'currentResponsible'});
      .populate({model: 'User',path: 'responsible1'});
      .populate({model: 'User',path: 'responsible2'});
      .populate({model: 'Client', path: 'client'});

在本例中,mongoose给了我待处理的发票,但用我不需要的信息填充字段'currentResponsible','responsible 1','responsible 2',并且我没有在'fields'常量中请求这些信息。

我想要一个'Conditional Populate',它只在'fields'常量中需要该字段时才填充对象。

主要目标是创建一个模块化的GET API端点,它允许我从前端发送'query'和'fields'常量,以便从应用程序的不同部分仅获取所需的信息。
我根据这个other post和文档尝试了以下方法,但是性能非常慢(检索和填充1.300个文档需要1分钟,这不是一个可行的解决方案。)

const query = {status:"pending"};
const fields = "amount client";

const invoices = await Invoice.find(query,fields)

const populatedInvoices = []
for (const invoice of invoices) {
  if(fields.includes("client")){
    await invoice.populate({model: 'Client', path: 'client'}).execPopulate();
  }
  if(fields.includes("currentResponsible")){
    await invoice.populate({model: 'User', path: 'currentResponsible'}).execPopulate();
  }
  if(fields.includes("responsible1")){
    await invoice.populate({model: 'User', path: 'responsible1'}).execPopulate();
  }
  if(fields.includes("responsible2")){
    await invoice.populate({model: 'User', path: 'responsible2'}).execPopulate();
  }
  populatedInvoices.push(invoice)
}

如果方法是'findOne()'(只针对一个文档),那么前面提到的帖子和文档中评论的解决方案就可以工作,但在我的情况下,我希望它适用于'find()'(针对多个文档)
提前感谢您的帮助!:D

g9icjywg

g9icjywg1#

我找到了一个解决方案感谢聊天GPT:D由于不是所有的字段的发票模型需要填充,我创建了一个常数与所有需要填充的字段,这样,如果我要求这些发票字段,我会得到他们

const query = {status:"Pending",amount:{$gt:0}}
const fields = "client amount currentResponsible invoice status"
const INVOICE_FIELDS_TO_POPULATE = ['currentResponsible','responsible1', 'responsible2', 'client']
const invoices = await Invoice.find(query,fields).populate(fields.split(' ').filter(field=>INVOICE_FIELDS_TO_POPULATE.includes(field)).map((field) => ({ path: field })))

通过这种方式,我可以查询发票,只获取我需要的信息,并填写需要填充的字段。而且这种模式可以应用于API中的任何模型或资源。

相关问题