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

如何在NestJS中判断Mongoose聚合$lookup查询无返回数据?

解决Mongoose Aggregate $lookup后判断无数据的问题

你当前的判断逻辑有问题——Mongoose执行aggregate后,哪怕没有匹配到任何数据,返回的data也会是空数组,而不是null或undefined。所以if(!data)这个条件永远不会触发,因为空数组在布尔判断里是true(![] === false)。

正确的判断方式

直接检查数组的长度是否为0即可:if(data.length === 0)。同时建议在错误处理后直接返回,避免后续逻辑错误执行。

修改后的回调版本代码

this.friendrequestModel
  .aggregate([
    {
      $lookup: {
        from: "users",
        localField: "author",
        foreignField: "_id",
        as: "userdata",
      },
    },
  ])
  .exec((err, data) => {
    if (err) {
      console.log(err);
      return; // 出错后终止后续逻辑
    }

    // 正确判断无数据的情况
    if (data.length === 0) {
      console.log("No data returned");
      return;
    }

    // 有数据时的处理逻辑
    console.log("获取到请求数据:", data);
  });

更推荐的Async/Await版本

用异步函数写法会让代码更简洁易读,避免回调嵌套:

async function fetchFriendRequests() {
  try {
    const data = await this.friendrequestModel.aggregate([
      {
        $lookup: {
          from: "users",
          localField: "author",
          foreignField: "_id",
          as: "userdata",
        },
      },
    ]).exec();

    if (data.length === 0) {
      console.log("No data returned");
      return;
    }

    // 处理返回的数据
    console.log("获取到请求数据:", data);
  } catch (err) {
    console.error("查询出错:", err);
  }
}

// 调用函数
fetchFriendRequests();

补充说明

  • Mongoose的聚合查询、find查询等返回结果都是数组类型,无匹配时返回空数组,而非null。
  • 如果你的$lookup关联后userdata字段为空(即关联不到用户数据),但主集合friendrequest有数据,那data数组会包含文档,但每个文档的userdata是空数组。这种情况需要单独判断每个文档的userdata.length。

内容的提问来源于stack exchange,提问作者Alms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:20:38