使用MongoTemplate的LookupOperation关联查询不到articleReply数据如何解决
问题修复方案
问题根因
MongoDB的
$lookup关联查询要求关联的两个字段类型完全一致才会匹配成功。当前场景中articleComment._id是ObjectId类型,articleReply.commentId是String类型,类型不匹配导致关联结果为空。
修复方案
提供两种可落地的方案,优先推荐第一种长期适用性更强:
方案1:统一字段类型(推荐)
- 把
articleReply集合里的所有commentId字段从String转为ObjectId类型,从数据层彻底解决类型不匹配问题,后续所有关联查询都不需要额外适配。 - 存量数据类型统一完成后,你原有代码无需修改即可正常返回关联的
reply数据。
方案2:聚合阶段添加类型转换(无需修改现有数据)
如果暂时无法修改存量数据,可以在聚合时先把articleComment._id转为字符串类型,再做关联查询,修改后的代码如下:
import org.bson.types.ObjectId; public void readComment(String commentId){ // 新增类型转换阶段:把_id转成字符串类型,存入临时字段commentIdStr AggregationOperation convertId = Aggregation.project() .andExpression("toString(_id)").as("commentIdStr") // 保留原需要返回的所有字段 .andInclude("territoryId","articleId","userId","userAccount","userHeadImage","comment","num","goodNum","activeFlag","updateTime","createTime"); LookupOperation lookup1 = LookupOperation.newLookup() .from("articleReply") .localField("commentIdStr") // 用转换后的字符串字段关联 .foreignField("commentId") .as("reply"); // 注意:入参commentId是字符串,要转成ObjectId才能匹配上_id字段 MatchOperation match = Aggregation.match(Criteria.where("_id").is(new ObjectId(commentId))); Aggregation agg = Aggregation.newAggregation(match,convertId,lookup1); AggregationResults<Map> articleComment = mongoTemplate.aggregate(agg,"articleComment",Map.class); System.out.println(articleComment.getUniqueMappedResult()); }
内容的提问来源于stack exchange,提问作者TaoerLi
相关产品推荐
相关产品推荐

