使用DBRef从MongoDB查询数据:优化A集合关联查询需求
优化MongoDB关联查询方案
1. 用聚合查询($lookup)一次性完成关联与过滤
直接通过聚合管道关联A、B集合,避免两次查询的网络开销与$in操作的性能瓶颈,单次数据库操作即可得到结果。
MongoTemplate 代码实现
Aggregation aggregation = Aggregation.newAggregation( // 关联B集合,匹配DBRef中的$id字段与B的_id Aggregation.lookup("B", "B.$id", "_id", "tempB"), // 过滤符合条件的文档:无B引用 或 关联的B文档Type为alpha Aggregation.match( new Criteria().orOperator( Criteria.where("B").exists(false), Criteria.where("tempB").elemMatch(Criteria.where("Type").is("alpha")) ) ), // 可选:移除临时关联字段,返回原A文档结构 Aggregation.project().andExclude("tempB") ); List<ADocument> result = mongoTemplate.aggregate(aggregation, "A", ADocument.class).getMappedResults();
2. 针对性创建索引提升效率
给核心字段添加索引,大幅降低查询与关联的耗时:
- 给B集合的
Type字段建单键索引:db.B.createIndex({Type: 1}) - 给A集合的
B.$id字段建索引(DBRef实际存储为包含$id的对象):db.A.createIndex({"B.$id": 1})
3. 原方案低效的原因
原方案分两次查询,当B中Type为alpha的文档数量较多时,$in操作会因参数列表过长导致查询性能下降;同时两次查询增加了网络IO与数据库的重复处理开销,最终拖慢整体速度。
内容的提问来源于stack exchange,提问作者Puja
相关产品推荐
相关产品推荐

