Mongoose:向数组推入新文档后仅获取该子文档的_id
解决方法:获取新推入的子文档ID
嗨,我懂你的需求——你想给指定文章新增一条评论,并且只拿到这条新评论的_id,不想返回整个用户文档对吧?其实不用太复杂,咱们可以利用findOneAndUpdate返回的更新后文档,直接提取刚创建的子文档。
具体实现思路:
- 必须开启
{ new: true }选项,让findOneAndUpdate返回更新后的完整用户文档(默认返回更新前的); - 从返回的用户文档里,通过
req.params.id匹配到你刚更新的那篇文章; - 因为
$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
相关产品推荐
相关产品推荐

