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

