如何高效查询无关联订单的Shop文档?MongoDB性能优化
高效查询无关联订单的Shop文档
你的原方案性能拉胯的核心原因是:对每个Shop都执行一次嵌套子查询关联,数据量上来后开销直接爆炸,而且完全没用到索引优化空间。下面是两种更高效的实现方式:
方案一:优化版$lookup关联(推荐)
用简单的字段关联+匹配空结果的写法,配合索引能大幅提速:
db.shops.aggregate([ { $lookup: { from: "orders", localField: "_id", foreignField: "shop", as: "orders" } }, { $match: { orders: { $size: 0 } } }, { $project: { _id: 1 } // 只返回需要的字段,减少数据传输开销 } ])
优化点:这种$lookup的写法能让MongoDB更好地调用索引优化,只要你给orders.shop建了索引,关联速度会比子查询式的lookup快一大截。
方案二:分步查询(性能最优)
先提取所有有订单的店铺ID,再反向筛选无订单的店铺:
// 第一步:快速获取所有有订单的shop ID(自动去重) const orderedShopIds = db.orders.distinct("shop"); // 第二步:查询不在上述列表里的店铺 db.shops.find({ _id: { $nin: orderedShopIds } })
优化点:distinct操作会直接利用orders.shop的索引快速去重,后续的find也能借助shops._id的默认索引,整个流程的时间复杂度远低于全量聚合。
必须做的前置优化
先给orders.shop创建索引,这是所有优化方案的基础:
db.orders.createIndex({ shop: 1 })
没有这个索引,任何方案的性能都会大打折扣。
内容的提问来源于stack exchange,提问作者Dashiell Rose Bark-Huss
相关产品推荐
相关产品推荐

