MongoDB查询结果按另一查询ID数组排序返回全null如何解决
问题原因
- 存在冗余的await关键字:
Array.map()返回的是普通数组,并非Promise对象,不需要使用await修饰,此处的await不会改变数组的内容和类型,属于无效代码。 - 类型不匹配导致匹配失败:MongoDB返回的
question_oid和_id默认是ObjectId类型对象,而非字符串,直接用==对比两个不同引用的ObjectId对象会返回false,导致find方法匹配不到结果返回undefined,最终得到全空的数组。另外你打印typeof q_id_arr得到object是JS的正常表现,所有数组的typeof返回值都是object,不属于问题诱因。 - 原写法存在性能缺陷:原实现的时间复杂度为O(n²),每次遍历q_id_arr都要全量遍历一次team_trends,数据量较大时执行效率极低。
解决方案
推荐先统一转换ID类型消除类型差异,再通过哈希映射优化匹配效率,时间复杂度可降至O(n),实现代码如下:
// 1. 将目标ID数组的所有元素转为字符串,彻底消除类型差异 const qIdStrArr = user_trends.map(({ question_oid }) => question_oid.toString()); // 2. 把team_trends转换为以_id字符串为key的Map映射,仅需遍历一次 const trendMap = new Map(team_trends.map(item => [item._id.toString(), item])); // 3. 按目标顺序匹配得到排序后的结果 const sortedTeamTrends = qIdStrArr.map(id => trendMap.get(id));
如果存在ID匹配不到的场景,可以添加兜底逻辑避免后续操作报错:
const sortedTeamTrends = qIdStrArr.map(id => trendMap.get(id) || { positive: 0, engaged: 0 });
内容的提问来源于stack exchange,提问作者Izzi
相关产品推荐
相关产品推荐

