MongoDB查询计划WinningPlan为IDHACK的技术咨询
IDHACK Winning Plan in MongoDB Great question! Let's break down what the IDHACK stage means in your MongoDB query plan and why it's the optimal choice for your query.
What is IDHACK?
IDHACK is a specialized, optimized execution stage in MongoDB that’s exclusively built for queries targeting the _id field directly. Since every MongoDB collection automatically gets a unique, built-in index on the _id field, the query planner can skip the standard index scan (IXSCAN) + document fetch (FETCH) workflow and use this lightweight, purpose-built stage instead.
Why is it showing up in your query?
Your query is a precise, single-value match on the _id field:
db.restaurants.find({"_id" : ObjectId("5aabce4f827d70999ae5f5f7")})
MongoDB's query optimizer recognizes this as the most straightforward primary key lookup scenario. It knows the _id index is unique, so it can directly locate the exact document on disk without needing to traverse index entries—making IDHACK the fastest possible execution path here. The empty rejectedPlans array confirms there are no other viable plans that could outperform this one.
Key benefits of IDHACK
- Faster performance: It eliminates the overhead of a full index scan and directly targets the document's storage location.
- Lightweight operation: Unlike the combined
IXSCAN + FETCHstages,IDHACKis a single, purpose-built step optimized for primary key lookups. - Guaranteed uniqueness: Since
_idis always unique, MongoDB doesn't need to check for multiple matching documents, further streamlining the process.
When won't you see IDHACK?
You'll only get the IDHACK stage for queries that:
- Target only the
_idfield with an equality match ($eqor direct value assignment) - Don't include any additional query filters, projections, or sorting that would complicate the lookup
If you add other conditions to your query (e.g., {"_id": ObjectId("..."), "cuisine": "Italian"}) or use a range query on _id, the planner will switch back to the standard IXSCAN + FETCH workflow.
内容的提问来源于stack exchange,提问作者Rahul Raj




