如何在Mongoose查询中排除数组对象内的product_ref_id字段?
解决NestJS + Mongoose发票系统中排除数组子字段的问题
问题分析
你在Schema里已经给line_items.product_ref_id设置了select:false,但当前的查询select字符串写法错误,导致无法正确排除该子字段。直接使用--product_ref_id是针对顶层字段的语法,不适用于数组嵌套的子字段。
解决方案
1. 修正Select字符串格式
将你的GET_INVOICES_DETAILS常量修改为以下形式,通过嵌套字段语法指定排除数组中的product_ref_id:
const GET_INVOICES_DETAILS = "-_id invoice_uid invoice_no total invoice_status invoice_date due_date job financing is_paid created_at updated_at line_items.-product_ref_id estimate customer_billing_address customer_service_address sub_total discount total_discount remarks tax attachments public_url reference_no";
- 语法说明:
line_items.-product_ref_id表示保留整个line_items数组,但排除其中的product_ref_id字段,这是Mongoose中针对嵌套数组子字段的正确排除写法。 - 不需要保留原有的
--product_ref_id,它对嵌套字段无效。
2. 确保查询逻辑正确应用Select
在NestJS的Service层查询时,直接将该常量传入select()方法即可:
async getInvoiceDetail(invoiceId: string) { return this.invoiceModel.findById(invoiceId).select(GET_INVOICES_DETAILS).exec(); }
3. 关于Schema中select:false的补充说明
虽然你在Schema里给product_ref_id设置了select:false,但当你显式指定select字段列表时,Mongoose会忽略默认的select配置,必须在select字符串中明确排除该字段才能生效。
内容的提问来源于stack exchange,提问作者Ashin Thankachan
相关产品推荐
相关产品推荐

