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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:17:48