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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:07:02