Mongoose查询聊天记录时,如何排除当前用户并填充关联的另一用户?
解决Mongoose聊天记录查询中仅填充非当前用户的问题
你可以通过两种方式实现需求,直接看代码和说明:
方法一:用Populate的过滤规则
直接在populate里配置过滤条件,排除当前用户ID,代码如下:
const rawChats = await ChatModel.find({ users: { $in: [userId] } }) .populate({ path: 'users', match: { _id: { $ne: userId } }, // 可选:指定要返回的用户字段,比如排除敏感的密码字段 select: '-password' });
过滤后users数组里只会剩下另一个用户的信息,要是想把数组转成单个对象方便使用,可以在查询后做个映射:
const formattedChats = rawChats.map(chat => ({ ...chat.toObject(), partner: chat.users[0] }));
方法二:用聚合管道直接处理数据
如果想在数据库层面就把数据整理好,不用后续处理,可以用Mongoose的聚合管道:
const chats = await ChatModel.aggregate([ // 筛选包含当前用户的聊天记录 { $match: { users: userId } }, // 拆分users数组为单个文档 { $unwind: '$users' }, // 排除当前用户的ID { $match: { users: { $ne: userId } } }, // 关联User集合获取用户信息 { $lookup: { from: 'users', localField: 'users', foreignField: '_id', as: 'partner' } }, // 将partner数组转为单个对象 { $unwind: '$partner' }, // 保留需要的字段,按需调整 { $project: { _id: 1, createdAt: 1, updatedAt: 1, partner: 1 } } ]);
这种方式返回的每条聊天记录里直接带有partner字段,就是你要的另一个用户信息,不用再处理数组。
内容的提问来源于stack exchange,提问作者spatak
相关产品推荐
相关产品推荐

