如何在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
相关产品推荐
相关产品推荐

