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

MongoDB更新文档时$push添加新文档ID操作失效问题求助

问题原因及修复方案

核心问题点

  • 异步操作未加await:savedUser.update()是Mongoose的异步方法,你没有加await关键字等待操作完成,代码执行到打印逻辑时,$push操作还没落到数据库,自然看不到更新结果。
  • 内存对象未同步:即使数据库更新成功,你当前内存中的savedUser还是执行save()时返回的旧数据,不会自动同步数据库的最新状态,需要手动更新内存对象或者重新查询用户数据。
  • populated()方法使用错误:populated()是用来检测对应字段是否已经执行过populate()填充关联数据的方法,你没有调用过populate('products'),返回undefined是正常行为,该方法不能用来检查数组是否被成功更新。
  • 产品模型字段赋值不规范:你的productSchema中user_id定义为数组类型,直接赋值单个ObjectId虽然Mongoose会做隐式转换,但不符合字段定义规范,存在隐式风险。

修复后代码

const savedUser = await new UserModel({ ...user }).save();
// 按数组类型规范赋值user_id
product.user_id = [savedUser._id];
const savedProduct = await new ProductModel(product).save();
// 加await等待update操作执行完成,推荐用实例的updateOne方法更符合Mongoose新版本规范
await savedUser.updateOne({ $push: { products: savedProduct._id } });
// 手动更新内存中的savedUser对象,也可以重新查询数据库获取最新用户数据
savedUser.products.push(savedProduct._id);
// 如果需要获取填充后的关联产品数据,主动调用populate
await savedUser.populate('products');
// 此时可以正常打印products数组
console.log(savedUser.products);

额外优化建议

可以直接修改内存中的用户对象后再保存,写法更直观:

const savedUser = await new UserModel({ ...user }).save();
product.user_id = [savedUser._id];
const savedProduct = await new ProductModel(product).save();
// 直接修改内存对象后调用save完成更新
savedUser.products.push(savedProduct._id);
await savedUser.save();
await savedUser.populate('products');
console.log(savedUser.products);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 04:06:04