如何获取Mongoose中推入Post数组的新Comment的ID?
获取MongoDB内嵌评论的新ID解决方案
你遇到的这个问题很常见——Mongoose的findByIdAndUpdate默认返回的是更新前的文档,所以你console.log看到的是旧数据,但数据库已经成功更新了。下面给你几个靠谱的解决办法:
方法一:让findByIdAndUpdate返回更新后的文档
只需要给更新方法加上{ new: true }选项,就能拿到包含新评论的Post文档,然后取comments数组的最后一项的_id即可:
const newPost = await Post.findByIdAndUpdate( postId, { $push: { comments: { content } } }, { new: true } // 核心配置,返回更新后的文档 ); if (newPost) { // 新添加的评论一定在数组最后一位 const newCommentId = newPost.comments[newPost.comments.length - 1]._id; console.log("新评论ID:", newCommentId); }
方法二:提前手动生成评论ID
你可以先实例化一个Comment对象,此时Mongoose会自动给它生成_id,再把这个对象push到Post的comments数组里,这样不用等数据库更新就能拿到ID:
// 先创建评论实例,此时已生成_id const newComment = new (mongoose.model('Comment', commentSchema))({ content }); const commentId = newComment._id; // 直接拿到ID // 执行更新操作 await Post.findByIdAndUpdate( postId, { $push: { comments: newComment } }, { new: true } // 可选,若不需要返回完整文档可省略 ); console.log("新评论ID:", commentId);
补充说明
- 方法一适合需要同时获取更新后完整Post文档的场景;
- 方法二更适合只需要评论ID、不想额外处理数组的场景,性能也略优(少了一次数组遍历);
- 如果你用的是较新版本的Mongoose,
findByIdAndUpdate的new选项已经是推荐配置,避免默认返回旧文档带来的混淆。
内容的提问来源于stack exchange,提问作者Felix
相关产品推荐
相关产品推荐

