如何在MongoDB Aggregate的$lookup中使用$or与$and条件?
实现方案
要把你指定的$or+$and组合条件应用到聚合查询中,需要在$lookup之前添加$match阶段筛选符合条件的好友请求记录,之后再关联users集合获取用户数据。另外你的$or条件可以简化写法(MongoDB默认多个字段条件为逻辑与,无需嵌套$and),和原逻辑完全等价。
完整代码示例
import mongoose from 'mongoose'; // 先将传入的ID转为mongoose ObjectId类型 const targetAuthor = new mongoose.Types.ObjectId(author); const targetFriend = new mongoose.Types.ObjectId(friend_id); let rqs: any = this.friendrequestModel.aggregate([ // 第一步:筛选双向好友请求的记录 { $match: { $or: [ { author: targetAuthor, friend_id: targetFriend }, { author: targetFriend, friend_id: targetAuthor } ] } }, // 第二步:关联users集合获取作者的用户数据 { $lookup: { from: "users", localField: "author", foreignField: "_id", as: "userdata", }, }, // 可选:如果需要将userdata数组转为单个对象,添加此阶段 // { $unwind: "$userdata" } ]);
关键说明
$match放在$lookup前可以先过滤无效数据,减少关联操作的计算量,提升查询效率。- 若你需要同时获取双方用户数据,可以再添加一个
$lookup阶段,将localField设为friend_id来关联对方的用户信息。
内容的提问来源于stack exchange,提问作者Alms
相关产品推荐
相关产品推荐

