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

MongoDB查询如何从关联users数组中排除当前登录用户

问题描述

现有partnership集合结构如下,每个文档包含两位关联用户:

{
    "_id": {
        "$oid": "6381697ddddbdb42b4682fb7"
    },
    "users": [{
        "$oid": "user_one_id"
    }, {
        "$oid": "user_two_id"
    }]
}

当前登录用户ID为user_one_id,使用以下代码查询关联伙伴并填充用户信息:

let partners =
  await userPartnerModel.find({
    users: { $in: [req.user._id] }
  }).sort({ createdAt: -1 })
    .populate({ 
      path: 'users', 
      select: 'profilePic firstName', 
      model: userModel 
    })

res.status(200).json(partners)

但返回结果中包含了当前登录用户本身,需求是仅返回对应的合作伙伴(即user_two_id对应的用户)。

解决方案

可以通过两种方式实现需求:

方式一:查询后在代码层面过滤

查询完成后,遍历结果集,从每个文档的users数组中剔除当前登录用户,只保留合作伙伴:

let partners = await userPartnerModel.find({
    users: { $in: [req.user._id] }
}).sort({ createdAt: -1 })
  .populate({ 
    path: 'users', 
    select: 'profilePic firstName', 
    model: userModel 
  });

// 处理结果,过滤掉当前用户
const filteredPartners = partners.map(partnerDoc => {
  // 从users数组中筛选出不是当前登录用户的项
  const partner = partnerDoc.users.find(user => user._id.toString() !== req.user._id.toString());
  return partner;
}).filter(Boolean); // 过滤掉可能的空值

res.status(200).json(filteredPartners);

方式二:使用MongoDB聚合管道(数据库层面过滤)

通过聚合管道直接在数据库中完成匹配、填充和过滤,效率更高,适合数据量较大的场景:

let partners = await userPartnerModel.aggregate([
  // 匹配包含当前用户的伙伴关系文档
  { $match: { users: req.user._id } },
  // 按创建时间倒序排序
  { $sort: { createdAt: -1 } },
  // 拆分users数组为单个文档
  { $unwind: "$users" },
  // 排除当前用户
  { $match: { users: { $ne: req.user._id } } },
  // 填充用户信息
  {
    $lookup: {
      from: 'users', // 用户集合名称
      localField: 'users',
      foreignField: '_id',
      as: 'partner'
    }
  },
  // 展开填充后的伙伴数据
  { $unwind: "$partner" },
  // 只保留需要的字段
  {
    $project: {
      _id: "$partner._id",
      profilePic: "$partner.profilePic",
      firstName: "$partner.firstName"
    }
  }
]);

res.status(200).json(partners);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:55:22