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

升级Mongoose至6.6.1后调用.save()出现owner.$populated is not a function验证错误

问题:Mongoose升级至6.6.1后Date字段验证报错(owner.$populated is not a function)

将Mongoose版本升级至6.6.1后,调用Document的save()方法时触发验证错误,此前该操作可正常保存数据。涉及Date类型字段,但字段格式看似无误,报错信息提示owner.$populated is not a function,且错误提及了未在代码中定义的owner字段。

相关对象代码

new MyTask({
        "source": {
                    "client_id" : "ABC",
                    "ip"        : "127.0.0.1"
                  },
       "invoice": {
                    "amount"    : 1000,
                    "currency"  : "eur",
                    "dueAt"     : "2022-10-23T14:55:57.482Z",
                    "issuedAt"  : "2022-07-25T13:55:57.480Z",
                    "number"    : "724/001"        
                  }
    }).save();

Schema定义

var invoice_schema = new Schema({
                "amount"   : {type:Number,    required:true},
                "currency" : {type:String,    required:true}, 
                "dueAt"    : {type:Date,      required:true}, 
                "issuedAt" : {type:Date,      required:true},
                "number"   : {type:String}                    
                                },
               {
                timestamps:true,
                toObject  : { virtuals: true },
                toJSON    :   { virtuals: true }  
               });

var MYTASK_SCHEMA = new Schema(
  {
   source : {
              ip         : {type: String},
              client_id  : {type: String}
             },        
   invoice: {type        : invoice_schema}
  },
  {
   timestamps:true,
   toObject: { virtuals: true },
   toJSON  : { virtuals: true }  
  });

报错信息

Error: MyTask validation failed: 
          invoice.dueAt: owner.$populated is not a function, 
          invoice.issuedAt: owner.$populated is not a function, 
          invoice: Validation failed: 
              dueAt: owner.$populated is not a function, 
              issuedAt: owner.$populated is not a function
    at ValidationError.inspect (/app/node_modules/mongoose/lib/error/validation.js:48:26)
    at formatValue (node:internal/util/inspect:790:19)
    at inspect (node:internal/util/inspect:350:10)
    at formatWithOptionsInternal (node:internal/util/inspect:2241:40)
    at formatWithOptions (node:internal/util/inspect:2103:10)
    at console.value (node:internal/console/constructor:348:14)
    at console.warn (node:internal/console/constructor:381:61)

问题原因

这是Mongoose 6.6.x版本的已知bug:当嵌套Schema包含Date类型字段,且该Schema开启了virtuals: true配置时,内部验证逻辑会出现异常。错误中提到的owner是Mongoose内部用于跟踪文档关联关系的对象,并非你代码中定义的业务字段。

解决方法

有三种可行方案:

  1. 降级版本:暂时回退到Mongoose 6.5.x版本(如6.5.4),该版本不存在此验证bug,可恢复正常保存逻辑。
  2. 临时修改Schema配置:若需保留6.6.1版本,可关闭嵌套Schema的virtuals选项(将invoice_schema配置中的toObject和toJSON里的virtuals: true改为false),待官方修复后再重新开启。
  3. 升级至修复版本:该bug在Mongoose 6.7.x及后续版本中已被修复,直接升级到这些版本即可解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:20:17