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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:20:32