Mongoose查询时有效值字段返回null问题排查求助
Mongoose聚合查询中
region字段返回null问题排查 问题概述
使用Mongoose定义模型后执行聚合查询,groupCount字段返回符合预期,但通过$first:"$region"获取的group字段始终为null。数据库中region字段存在有效值,且使用Studio3T执行相同查询时group字段能正常返回对应值。
Schema定义
module.exports = function (mongoose) { const Types = mongoose.Schema.Types; const collectionName = "audit_todays_date" const Schema = new mongoose.Schema( { employeeName: { type: Types.String, }, adminGroup: { type: Types.String, }, days: { type: Types.String, }, lanId: { type: Types.String, }, bedDev: { type: Types.String, }, followUp: { type: Types.String, }, totalVariance: { type: Types.Number, }, highRisk: { type: Types.Number, }, highModRisk: { type: Types.Number, }, modRisk: { type: Types.Number, }, lowRisk: { type: Types.Number, }, busPractveEventsRisk: { type: Types.Number, }, otherRisk: { type: Types.Number, }, batch_id: { type: Types.Number, }, createdAt: { type: Types.Date, }, serviceGroup: { type: Types.String, }, riskScoreFlag: { type: Types.String, }, riskTotalPercentage:{ type: Types.Number }, facility: { type: Types.String, }, campus: { type: Types.String, }, region: { type: Types.String, }, }, { collection: "audit_todays_date", } ); Schema.index({ 'lanID': 1 }) Schema.index({ 'adminGroup': 1 }) Schema.index({ 'employeeName': 1 }) Schema.index({ 'bedDev': 1 }) Schema.index({ 'maxStdDeviation': 1 }) Schema.statics = { collectionName: collectionName, routeOptions: { allowList: false, allowRead: false, allowCreate: false, allowUpdate: false, allowDelete: false, }, }; return Schema; };
执行的聚合查询
model = mongoose.model('audit_todays_date') aggPipe = [ {$match: {flag_priority: {$gte:8}}}, {$group: { "_id": {"regionId": "$regionId"}, "groupCount": {$sum:1}, "group": {$first:"$region"} }} ] var data = await model.aggregate(aggPipe).allowDiskUse(true)
查询结果对比
Mongoose返回结果
[ { "_id": { "regionId": "swwi" }, "groupCount": 8, "group": null }, { "_id": { "regionId": "florida" }, "groupCount": 23, "group": null }, { "_id": { "regionId": "arizona" }, "groupCount": 21, "group": null }, { "_id": { "regionId": "rochester" }, "groupCount": 84, "group": null }, { "_id": { "regionId": "semn" }, "groupCount": 7, "group": null }, { "_id": { "regionId": "swmn" }, "groupCount": 11, "group": null }, { "_id": { "regionId": "nwwi" }, "groupCount": 16, "group": null } ]
Studio3T执行结果
Studio3T中执行相同聚合查询,group字段能正确返回对应区域的值,与数据库中存储的region字段内容一致。
排查方案
1. 启用lean()获取纯JSON对象
Mongoose聚合默认返回Mongoose文档对象,可能存在字段转换问题,尝试添加.lean()获取纯JSON结果:
var data = await model.aggregate(aggPipe).allowDiskUse(true).lean()
2. 关闭Schema的strict模式
当前Schema未显式设置strict,默认值为true,会过滤Schema中未定义的字段(如查询中用到的flag_priority、regionId),可能影响聚合结果的字段读取。可在Schema定义时关闭strict:
const Schema = new mongoose.Schema( { /* 原字段定义 */ }, { collection: "audit_todays_date", strict: false // 添加此配置 } );
或在聚合查询时临时关闭:
var data = await model.aggregate(aggPipe).allowDiskUse(true).setOptions({ strict: false })
3. 使用MongoDB原生驱动执行查询对比
直接用原生驱动执行聚合,确认是否是Mongoose的问题:
const db = mongoose.connection.db; var data = await db.collection('audit_todays_date').aggregate(aggPipe).allowDiskUse(true).toArray();
如果原生驱动返回的group字段正常,说明问题出在Mongoose的配置或模型定义上。
4. 确保模型使用最新Schema定义
若之前已创建过同名模型,可能使用的是旧Schema,需先删除旧模型再重新创建:
// 先删除已存在的模型 if (mongoose.models['audit_todays_date']) { delete mongoose.models['audit_todays_date']; } // 重新加载Schema并创建模型 const auditSchema = require('./path/to/your/schema/file')(mongoose); const model = mongoose.model('audit_todays_date', auditSchema);
5. 检查字段名大小写一致性
确认数据库中实际存储的字段名与Schema定义、聚合查询中的字段名完全一致(如region是否被写成Region或其他变体),Mongoose对字段名大小写敏感。
内容的提问来源于stack exchange,提问作者Mitchell Leefers
相关产品推荐
相关产品推荐

