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
相关产品推荐
相关产品推荐

