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

如何在MongoDB中从对象数组中获取指定评论的点赞数?

获取指定评论的点赞数方法

针对你的需求,这里提供几种可行的实现方式,解决你之前用find和$elemMatch没拿到目标数据的问题:

方法一:用findOne配合投影筛选目标评论

这种方法会返回包含匹配评论的文档,但只保留目标评论对象,之后你可以从中提取点赞数:

const post = await Post.findOne(
  { _id: postDataID },
  { comments: { $elemMatch: { _id: commentDataID } } }
);
const likes = post?.comments[0]?.likes; // 提取点赞数

这里注意,查询条件只需要匹配文章_id,投影部分用$elemMatch筛选出指定_id的评论,这样返回的comments数组里只会有目标评论对象。

方法二:用聚合管道精准提取点赞数

如果想直接拿到点赞数而不是整个评论对象,用聚合管道更高效:

const result = await Post.aggregate([
  // 第一步:匹配目标文章
  { $match: { _id: postDataID } },
  // 第二步:拆分comments数组为单个文档
  { $unwind: "$comments" },
  // 第三步:匹配目标评论
  { $match: { "comments._id": commentDataID } },
  // 第四步:只保留likes字段
  { $project: { _id: 0, likes: "$comments.likes" } }
]);
const likes = result[0]?.likes; // 拿到点赞数

方法三:用$filter在投影中筛选(MongoDB 3.2+)

这种方法不用拆分数组,直接在投影里过滤出目标评论:

const post = await Post.findOne(
  { _id: postDataID },
  {
    comments: {
      $filter: {
        input: "$comments",
        cond: { $eq: ["$$this._id", commentDataID] }
      }
    }
  }
);
const likes = post?.comments[0]?.likes;

为什么你之前的代码没成功?

你之前的find语句只是匹配包含目标评论的文章,但默认会返回整个文章的所有数据,包括全部comments数组,并没有筛选出单个评论。需要把$elemMatch放在投影参数里,而不是查询条件里(除非你要过滤掉不包含目标评论的文章,但这不是你的需求)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 05:08:15