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
相关产品推荐
相关产品推荐

