Mongoose关联字段生成空数组?如何实现双向关联同步?
Mongoose 双向关联同步问题解答
问题1:是否需要每次手动推送新Comment的ID到User的comments数组?
默认情况下是需要手动处理的。Mongoose不会自动维护这种双向关联的引用——当你仅设置Comment的author字段时,User的comments数组不会自动更新,必须手动执行更新操作,把新Comment的_id推送到对应User的comments数组中。
问题2:有没有自动同步该数组字段的方法?
有几种方案可以实现自动同步,这里列举常用的两种:
1. 使用Mongoose中间件(Middleware)
在Comment模型上定义post保存中间件,当Comment创建成功后,自动触发更新User的操作:
commentSchema.post('save', async function(doc) { await User.findByIdAndUpdate( doc.author, { $push: { comments: doc._id } }, { new: true, useFindAndModify: false } ); });
注意:如果涉及更新Comment的
author字段,还需要额外添加findOneAndUpdate类的中间件,因为post('save')仅在调用save()或create()时触发。
2. 使用MongoDB事务(Transactions)
如果你的MongoDB版本在4.0及以上,可以将创建Comment和更新User的操作放在同一个事务中,确保数据一致性(两个操作要么都成功,要么都回滚):
const session = await mongoose.startSession(); session.startTransaction(); try { // 创建新评论 const newComment = new Comment({ author: userId, text: 'Hello World!' }); await newComment.save({ session }); // 更新对应用户的评论数组 await User.findByIdAndUpdate( userId, { $push: { comments: newComment._id } }, { session, new: true, useFindAndModify: false } ); await session.commitTransaction(); } catch (err) { await session.abortTransaction(); throw err; } finally { session.endSession(); }
另外也可以考虑:如果业务场景不需要从User端快速获取所有评论,完全可以只保留Comment到User的单向引用,查询用户评论时直接用Comment.find({ author: userId }),这样能省去双向同步的复杂度。
内容的提问来源于stack exchange,提问作者SalehisCoding
相关产品推荐
相关产品推荐

