You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

mongoose-paginate-v2结合mongoose-lean-virtuals:如何为lean方法设置virtuals参数

解决mongoose-paginate-v2结合mongoose-lean-virtuals时虚拟字段不返回的问题

问题说明

在使用mongoose-paginate-v2做MongoDB分页查询时,已在分页选项中设置lean: true,同时通过mongoose-lean-virtuals插件配置了虚拟字段stockStatus,但最终查询结果中并未返回该虚拟字段。

解决方案

mongoose-paginate-v2的lean选项若设置为布尔值true,不会自动启用虚拟字段返回。需要将lean配置为对象形式,显式指定要包含的虚拟字段:

lean: { virtuals: ['stockStatus'] }

同时需确保mongoose-lean-virtuals插件已正确注册到Schema上,注册顺序无强制要求,建议先注册lean虚拟插件,再注册分页插件。

修改后的代码示例

1. 更新分页选项函数

调整lean的配置逻辑,当启用lean模式时,传入包含虚拟字段的对象:

exports.paginationOptions = (req, docName, isLean) => {
    const options = {       
        // 替换原lean: true,改为对象形式指定虚拟字段
        lean: { virtuals: ['stockStatus'] },
        page: req.query.page,
        limit: req.query.limit,
        sort: { _id: req.query.sort },
        customLabels:   {
            totalDocs: 'itemCount',
            docs: docName,
            limit: 'perPage',
            page: 'currentPage',
            nextPage: 'next',
            prevPage: 'prev',
            totalPages: 'pageCount',
            pagingCounter: 'slNo'    
        }
    }
    // 处理isLean为false的情况
    if (isLean === false) {
        options.lean = false;
    }
    return (!req.query.page || !req.query.limit) ?  {...options, pagination: false} : options
};

2. 确认模型配置(无需修改,仅验证)

确保Schema已正确注册插件,虚拟字段定义正常:

const ProductSchema = new Schema({
  SKU :  { type: String, index: true, unique: true },
  title: String,
  description: String,
  status: String,
  brand: String,
  supplier: String,
  stockUnit: String,
  manufacturer: String,
  manufacturerReference: String
},
{
  timestamps: true
})

// 定义虚拟字段
ProductSchema.virtual('stockStatus').get(function() {
  return 1
})

// 注册插件
ProductSchema.plugin(mongooseLeanVirtuals);
ProductSchema.plugin(mongoosePaginate);

module.exports = mongoose.model('Product', ProductSchema)

3. 控制器代码(无需修改)

原控制器调用逻辑保持不变,传入更新后的分页选项即可:

Product.paginate({}, paginationOptions(req, 'productsList'))
    .then(result => {
        res.json({ message: "Products list",...result});
    })
    .catch (error => {
        next(error);
    })    

内容的提问来源于stack exchange,提问作者Fariss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 10:02:22