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

