Mongoose如何基于find返回的多结果字段执行二次查询
问题根因
cR.find({myid: "xxxxxx"})返回的是匹配条件的文档数组,不是单个文档对象,直接在数组上访问.class_id得到的是undefined,自然无法作为第二个查询的合法匹配条件。
实现方案
方案1:提取ID后批量查询(推荐,性能最优)
先从返回的结果数组中提取所有class_id组成数组,再用MongoDB的$in操作符一次性查询关联的Cl集合数据,全程只需要2次数据库查询,和返回结果条数无关。
// 查询cR集合匹配数据 let rE = await cR.find({myid: "xxxxxx"}); // 提取所有有效class_id,过滤掉空值避免查询异常 const classIdList = rE.map(item => item.class_id).filter(Boolean); // 批量查询Cl集合匹配数据 let cla = await Cl.find({_id: {$in: classIdList}});
注意事项:
- 不要用循环遍历rE、逐条调用
Cl.find()的写法,这种写法会产生N次数据库请求,数据量稍大就会出现明显性能问题。 - 如果
classIdList是空数组(比如cR没有匹配到任何数据),$in查询会直接返回空结果,不会抛出异常,不需要额外做空值拦截。
方案2:用populate实现关联查询(Schema配置关联时可用)
如果定义cR的Schema时,已经给class_id字段配置了ref指向Cl模型,可以直接用Mongoose内置的populate方法一次查询带出关联数据,不需要分两次写查询逻辑:
// 查询cR数据时直接关联填充class_id对应的Cl文档 let rE = await cR.find({myid: "xxxxxx"}).populate('class_id');
执行后rE数组中每一项的class_id字段,就是对应的Cl模型完整文档,不需要再单独查询Cl集合。
内容的提问来源于stack exchange,提问作者devdude19289
相关产品推荐
相关产品推荐

