我有这样一段代码,我想得到待处理的发票,我只想得到客户端和金额字段。
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
1条答案
按热度按时间g9icjywg1#
我找到了一个解决方案感谢聊天GPT:D由于不是所有的字段的发票模型需要填充,我创建了一个常数与所有需要填充的字段,这样,如果我要求这些发票字段,我会得到他们
通过这种方式,我可以查询发票,只获取我需要的信息,并填写需要填充的字段。而且这种模式可以应用于API中的任何模型或资源。