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

Mongoose中$push子文档仅生成ObjectId,未插入指定字段的问题

Mongoose子文档插入仅生成_id,字段内容丢失的问题排查

我最近在使用Mongoose操作MongoDB时踩了个大坑——往userWallet模型的Transactions数组插入子文档时,始终只有自动生成的_id被保存,我指定的Datum、CODE等字段完全没写入数据库。本来以为嵌套文档插入是很基础的操作,结果折腾了两天才找到问题根源,分享出来给大家避避坑。

我的模型定义

var userWalletSchema = new Schema({
  userid: {type: Schema.ObjectId, ref: 'users'},
  Transactions: [{
    Datum: {Type: Date},
    CODE: {Type: String},
    aantal: {Type: Number},
    soortTransactie: {Type: String},
    bedrag: {Type:Number}
  }]
}, {collection:'userWallet'});

插入的文档与更新代码

要插入的子文档:

var newRecord = { Datum: '2017-12-21T00:00:00+01:00', CODE: 'IE00B3VWN518', aantal: 48, soortTransactie: 'Aankoop', bedrag: 478 };

执行的更新操作:

UserWallet.findOneAndUpdate(
  { userid: mongoose.Types.ObjectId(req.user.id)},
  { $push: {Transactions: newRecord}},
  { upsert: false },
  function (err, model) {
    console.log(err);
    console.log(model);
  });

问题现象

我尝试了各种参数组合:调整upsert的值、修改查询条件写法、甚至换用updateOne方法,但结果始终一致——Transactions数组里只新增了一个只有_id的空对象(类似{_id: ObjectId('5a490c3376dfb6630464f6e1')}),传入的所有字段内容都没有被保存进去。

解决方案

最后才发现是一个超级低级的拼写错误:Mongoose Schema中定义字段类型的关键字是小写的type,但我所有子文档的字段都写成了大写的Type!

因为Schema的字段定义不合法,Mongoose无法识别这些字段的类型规则,所以插入时直接忽略了这些字段,只自动生成了子文档默认的_id。把所有Type改成小写的type之后,问题立刻解决,子文档的所有字段都能正常写入数据库了。

内容的提问来源于stack exchange,提问作者Non Plus Ultra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:50:29