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

Mongoose:向数组推入新文档后仅获取该子文档的_id

解决方法:获取新推入的子文档ID

嗨,我懂你的需求——你想给指定文章新增一条评论,并且只拿到这条新评论的_id,不想返回整个用户文档对吧?其实不用太复杂,咱们可以利用findOneAndUpdate返回的更新后文档,直接提取刚创建的子文档。

具体实现思路:

  1. 必须开启{ new: true }选项,让findOneAndUpdate返回更新后的完整用户文档(默认返回更新前的);
  2. 从返回的用户文档里,通过req.params.id匹配到你刚更新的那篇文章;
  3. 因为$push是把新元素追加到数组末尾,所以这篇文章的comments数组最后一项就是你刚创建的评论,直接取它的_id即可。

修改后的代码示例:

User.findOneAndUpdate(
  { 'posts._id': req.params.id },
  { 
    $push: { 
      'posts.$.comments': { 
        from: { _id: req.user._id, username: req.user.username },
        body: req.body.commentBody 
      } 
    } 
  },
  { new: true }, // 关键配置:返回更新后的文档
  (err, updatedUser) => {
    if (err) {
      console.error('更新操作出错:', err);
      return;
    }

    // 定位到被更新的目标文章
    const targetPost = updatedUser.posts.find(post => 
      post._id.toString() === req.params.id // 注意ObjectId与字符串的类型匹配
    );

    if (!targetPost) {
      console.log('未找到指定的文章');
      return;
    }

    // 获取刚创建的评论(数组最后一项)
    const newComment = targetPost.comments.at(-1); // 用at(-1)比length-1更简洁直观
    const newCommentId = newComment._id;

    // 这里就可以用newCommentId执行后续操作了
    console.log('新评论的ID:', newCommentId);
  }
);

小提醒:

  • 如果你的req.params.id本身就是ObjectId类型(而非字符串),可以直接用post._id.equals(req.params.id)来匹配,不需要转字符串;
  • MongoDB会自动为新推入的子文档生成_id,你不需要手动指定,直接提取即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:27:37