如何实现排除当前请求用户的正则匹配用户列表查询?
解决方法
核心问题是你的查询条件未排除当前发起请求的用户,以下两种方案都能解决问题,优先推荐数据库层面处理,效率更高。
方案一:数据库查询阶段排除当前用户
先确认能获取到当前请求用户的_id(登录接口通常会通过认证中间件将用户信息挂载到req.user上,比如JWT验证),然后在User.find的查询条件中用$and组合筛选规则和排除自身的条件:
router.get("/bulk",async (req, res) => { const filter = req.query.filter || ""; // 根据你的认证方式调整当前用户ID的获取逻辑 const currentUserId = req.user._id; const users = await User.find({ $and: [ { $or: [ { firstName: { $regex: filter } }, { lastName: { $regex: filter } } ] }, // 排除当前用户 { _id: { $ne: currentUserId } } ] }); res.json({ user: users.map((user) => ({ username: user.username, firstName: user.firstName, lastName: user.lastName, _id: user._id, })) }); });
方案二:查询结果后过滤(效率较低,仅作备选)
如果暂时无法在数据库层面处理,可在查询到用户列表后,先通过filter排除当前用户再执行map转换(注意filter要放在map之前,这是你之前操作无效的关键原因):
router.get("/bulk",async (req, res) => { const filter = req.query.filter || ""; // 转成字符串避免ObjectId与字符串比对的类型问题 const currentUserId = req.user._id.toString(); const users = await User.find({ $or: [ { firstName: { $regex: filter } }, { lastName: { $regex: filter } } ] }); res.json({ user: users .filter(user => user._id.toString() !== currentUserId) .map((user) => ({ username: user.username, firstName: user.firstName, lastName: user.lastName, _id: user._id, })) }); });
注意事项
currentUserId的获取逻辑要匹配你的认证方案,比如用session的话可能是req.session.userId,按需调整。- MongoDB的
ObjectId和字符串比对时要统一类型,避免因类型不匹配导致过滤失效。
内容的提问来源于stack exchange,提问作者harsh tiwari
相关产品推荐
相关产品推荐

