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

如何在Mongoose的find方法中使用OR条件查询全部已通过好友?

解决MongoDB查询已通过好友请求的逻辑问题

你需要用MongoDB的$or操作符来实现「sender或receiver等于当前用户ID」的逻辑,直接用||是JavaScript语法,MongoDB查询并不识别。

正确的查询写法

假设你已经拿到当前登录用户的ID(比如currentUserId),查询代码应该写成这样:

// 导入你的FriendRequest模型
const FriendRequest = require('../models/FriendRequest');
const User = require('../models/User');

// 在/:user/friends路由的处理函数里
router.get('/:user/friends', async (req, res) => {
  const currentUserId = req.user._id; // 假设通过中间件获取到当前用户ID
  try {
    // 查询所有已通过、且当前用户是发送方或接收方的请求
    const acceptedRequests = await FriendRequest.find({
      status: 'accepted',
      $or: [
        { sender: currentUserId },
        { receiver: currentUserId }
      ]
    });

    // 提取好友ID:当前用户是sender则取receiver,是receiver则取sender
    const friendIds = acceptedRequests.map(request => {
      return request.sender.toString() === currentUserId.toString() 
        ? request.receiver 
        : request.sender;
    });

    // 根据好友ID查询用户详情,用于页面展示
    const friends = await User.find({ _id: { $in: friendIds } });

    // 把好友数据传给页面模板渲染
    res.render('friends', { friends });
  } catch (err) {
    console.error(err);
    res.status(500).send('服务器错误');
  }
});

额外注意点

  1. ObjectId类型匹配:如果currentUserId是字符串类型,要确保和sender/receiver的ObjectId类型一致,可通过mongoose.Types.ObjectId(currentUserId)转换后再查询,避免因类型不匹配导致无结果。
  2. 性能优化:如果好友请求数据量较大,建议给status、sender、receiver字段建立复合索引,提升查询速度:
// 在FriendRequest Schema中添加索引
FriendRequestSchema.index({ status: 1, sender: 1 });
FriendRequestSchema.index({ status: 1, receiver: 1 });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 10:32:17