MongoDB $lookup静态与动态匹配的查询优化及索引使用问询
MongoDB $lookup 优化与索引问题解答
静态条件预匹配优化说明
MongoDB查询规划器不会自动执行这种预缓存超集的优化操作。当前$lookup的逻辑是针对orders集合的每一条文档,独立执行子管道查询。子管道里的静态条件$eq: ["$adder_id", some_object_id]会和动态条件$eq: ["$friend_id", "$$_id"]一同,在处理每一条orders文档时被同时计算,不会提前缓存静态条件的匹配结果并复用。
如果想实现类似效果,可手动调整逻辑:先单独查询inventory集合,将符合静态条件的文档导出至临时集合(或内存),再与orders集合做关联。这种方式需自行处理数据同步问题,更适合数据更新频率低的场景。
动态条件的索引可用性
第二个条件$eq: ["$friend_id", "$$_id"]可以使用索引,但需要满足前提:在inventory集合的friend_id字段上创建单字段索引,或者创建包含adder_id和friend_id的复合索引({adder_id: 1, friend_id: 1}),这样能大幅提升整个$match条件的执行效率。
需要注意的是,由于是在$expr中引用外部变量$$_id,MongoDB会将每一条orders文档的_id值代入后,利用索引快速查找inventory中的匹配文档。
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

