TypeScript中使用mongoose-paginate-v2分页无结果问题求助
问题:mongoose-paginate-v2分页返回空结果(集合确认存在数据)
可能原因及排查方案
1. 字段命名不匹配(核心嫌疑)
你的IOfflineMacroAction接口定义的是下划线命名的字段(created_at、updated_at、deleted_at),但Schema中:
- timestamps默认生成
createdAt、updatedAt(驼峰格式) - 自定义删除字段是
deletedAt(驼峰格式)
如果MongoDB集合中实际存储的是下划线命名的字段,mongoose会因为字段名不匹配无法正确映射数据,最终导致查询返回空。
解决方案:
统一字段命名风格,修改Schema的timestamps配置和删除字段名:
const offlineMacroActionSchema: Schema = new Schema({ name: { type: String, required: true }, is_child: { type: Boolean, default: false }, order: { type: Number, default: 100 }, deleted_at: { // 改为下划线命名 type: Date, default: null } }, { // 指定timestamps生成下划线格式字段 timestamps: { createdAt: 'created_at', updatedAt: 'updated_at' }, toJSON: { virtuals: true }, toObject: { virtuals: true } });
2. 分页Options参数异常
你未提供options变量的具体内容,如果其中包含错误的过滤条件(如match规则错误、select字段配置异常),会导致查询无结果。
排查方案:
先用最简分页参数测试:
const options = { page: 1, limit: 10 }; OfflineMacroAction.paginate({}, options, (err, result) => { console.log(result); });
3. 模型与集合映射错误
你创建模型时指定了第三个参数为'offlineMacroActions',需确认MongoDB中实际集合名与该参数完全一致(MongoDB集合名区分大小写)。
排查方案:
在MongoDB Shell中执行:
db.offlineMacroActions.find()
如果能查到数据,说明集合名正确;否则检查集合名是否存在拼写或大小写错误。
4. 基础查询验证
先跳过分页插件,用普通find查询验证模型是否能获取数据:
OfflineMacroAction.find({}, (err, docs) => { console.log('基础查询结果:', docs); });
- 如果
find也返回空,问题出在模型与集合的映射/字段匹配,回到原因1、3排查 - 如果
find能查到数据,再检查分页插件的注册是否正确(确认offlineMacroActionSchema.plugin(paginate);在模型导出前执行)
5. 软删除数据过滤
如果集合中数据的deleted_at(或deletedAt)字段不为null,而你的查询条件未排除这些数据,会导致返回空。
解决方案:
在分页查询条件中添加软删除过滤:
OfflineMacroAction.paginate({ deleted_at: null }, options, (err, result) => { console.log(result); });
内容的提问来源于stack exchange,提问作者Hassan Shahid
相关产品推荐
相关产品推荐

