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

Node.js Mongoose数组对象存在性判断及帖子点赞状态查询

解决Mongoose中返回带用户点赞状态的帖子列表问题

嘿,这问题我熟!要实现返回包含当前用户点赞状态的帖子列表,咱们可以借助Mongoose的聚合框架来完成,不用额外的查询操作,一步到位。

实现思路

核心是利用$addFields聚合操作符,给每个帖子添加一个自定义字段(比如isLiked),通过$in判断当前请求的用户ID是否存在于帖子的likes.userId数组中,从而得到点赞状态。

具体代码实现

假设你用Express来写接口,代码大概是这样的:

const mongoose = require('mongoose');
const Post = require('./models/Post'); // 导入你的Post模型
const express = require('express');
const router = express.Router();

router.get('/get_posts/:userID', async (req, res) => {
  try {
    // 把URL参数里的userID转换成Mongoose的ObjectId类型
    const currentUserId = mongoose.Types.ObjectId(req.params.userID);

    // 聚合查询帖子列表,添加点赞状态字段
    const posts = await Post.aggregate([
      {
        $addFields: {
          // 判断当前用户ID是否在likes数组的userId中,返回布尔值
          isLiked: { $in: [currentUserId, "$likes.userId"] }
        }
      },
      // 可选:如果你需要返回指定字段,可以加$project
      {
        $project: {
          message: 1,
          likeCount: 1,
          isLiked: 1
          // 其他你需要的字段都可以在这里指定
        }
      }
    ]);

    // 按照要求的格式返回
    res.status(200).json({ posts });
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

module.exports = router;

代码解释

  • mongoose.Types.ObjectId(req.params.userID):因为你的Post模型里likes.userId是ObjectId类型,所以必须把URL里的字符串ID转换成对应的类型,否则$in判断会失效。
  • $addFields:这个操作符会给每个文档添加新字段(这里是isLiked),不会修改原文档结构。
  • $in: [currentUserId, "$likes.userId"]:MongoDB的数组判断操作,检查currentUserId是否存在于likes数组的每个元素的userId字段组成的集合中,返回true或false。
  • 可选的$project:如果你不想返回帖子的所有字段,可以用这个操作符指定需要返回的字段,让响应更精简。

示例返回结果

按照你的要求,返回的格式会是这样的:

{
  "posts": [
    {
      "_id": "5ae1975acf8db214e4a920cf",
      "message": "test...",
      "likeCount": 12,
      "isLiked": true
    },
    {
      "_id": "5ae1976acf8db214e4a920d0",
      "message": "another post...",
      "likeCount": 5,
      "isLiked": false
    }
  ]
}

这样就能完美满足你的需求啦,每个帖子都带上了当前用户是否点赞的状态~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:03:12