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

如何在Mongoose中通过Post ID判断用户ID是否在点赞数组中?

在Mongoose中根据Post ID查询文档并检查用户是否点赞

我来给你捋清楚怎么实现这个需求——根据Post ID找到对应的User文档,同时验证指定用户是否在该Post的likes数组里。我会分享两种实用的实现方式,你可以根据业务场景选择:

第一步:定义对应的Mongoose Schema

首先得先把你的文档结构转换成Mongoose能识别的Schema,这样才能进行后续的数据库操作:

const mongoose = require('mongoose');
const { ObjectId } = mongoose.Schema.Types;

const UserSchema = new mongoose.Schema({
  _id: String, // 匹配你文档中字符串类型的用户ID
  posts: [
    {
      _id: ObjectId,
      likes: [
        {
          _id: ObjectId
        }
      ]
    }
  ]
});

const User = mongoose.model('User', UserSchema);

方式一:查询文档后在代码中判断(适合需要获取帖子其他信息的场景)

如果你除了判断点赞状态,还需要拿到该帖子的其他数据,这种方式更合适:

async function checkUserLikedPost(postId, targetUserId) {
  try {
    // 将字符串ID转换为Mongoose的ObjectId类型(和文档中的类型匹配)
    const postObjectId = new mongoose.Types.ObjectId(postId);
    const userObjectId = new mongoose.Types.ObjectId(targetUserId);

    // 查询包含目标Post的User文档
    const user = await User.findOne({
      'posts._id': postObjectId
    });

    if (!user) {
      console.log("未找到包含该Post的用户文档");
      return false;
    }

    // 从用户的posts数组中找到目标Post
    const targetPost = user.posts.find(post => post._id.equals(postObjectId));
    if (!targetPost) {
      console.log("该用户文档中未找到目标Post");
      return false;
    }

    // 检查目标用户是否在likes数组中
    const isLiked = targetPost.likes.some(like => like._id.equals(userObjectId));
    return isLiked;
  } catch (err) {
    console.error("查询过程出错:", err);
    throw err;
  }
}

注意:比较ObjectId时要用equals()方法,不能直接用===,因为ObjectId是对象类型,直接比较会判断引用而非值。

方式二:数据库层面直接过滤(适合仅需判断点赞状态的场景,更高效)

如果你只需要知道用户是否点赞,不需要获取额外数据,这种方式能减少数据传输,效率更高:

async function checkUserLikedPostEfficient(postId, targetUserId) {
  try {
    const postObjectId = new mongoose.Types.ObjectId(postId);
    const userObjectId = new mongoose.Types.ObjectId(targetUserId);

    // 同时匹配目标Post和该Post的likes数组包含目标用户
    const matchedUser = await User.findOne({
      'posts._id': postObjectId,
      'posts.likes._id': userObjectId
    });

    // 如果查询到结果,说明用户已点赞该Post
    return !!matchedUser;
  } catch (err) {
    console.error("查询过程出错:", err);
    throw err;
  }
}

MongoDB会自动处理嵌套数组的匹配逻辑,只要存在符合条件的Post且该Post的likes包含目标用户,就会返回对应的User文档。

额外提示

  • 如果你的用户ID是字符串类型(比如示例中的"userid"),那么不需要将targetUserId转换为ObjectId,直接用字符串匹配即可。
  • 为了提升查询速度,建议给posts._id和posts.likes._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 06:31:30