如何在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
相关产品推荐
相关产品推荐

