What Is the _id Field in MongoDB?
Learn what the _id field is in MongoDB, how ObjectId generation works, when to use a custom _id, and why the field is always unique and immutable.
Expected Interview Answer
The _id field is the mandatory primary key of every MongoDB document, automatically indexed and unique within its collection, and if you don't supply one, MongoDB generates a 12-byte ObjectId for it automatically.
Every document in every collection must have an _id field, and MongoDB enforces its uniqueness with a default index created automatically when the collection is made, so you never need to create that index yourself. If you insert a document without an _id, the driver generates an ObjectId client-side before sending the write; an ObjectId encodes a 4-byte timestamp, a 5-byte random value, and a 3-byte incrementing counter, which means ObjectIds are roughly sortable by creation time and are generated without a database round trip. You can also supply your own _id value of any BSON type (a string, a number, even a compound object) as long as it's unique in that collection, which is common when the natural key of your domain (like an email or an order number) should double as the primary key. The _id field is immutable once set — you cannot update it on an existing document.
- Guarantees a unique, indexed identifier for every document with zero setup
- ObjectId encodes creation time, enabling rough chronological sorting without a separate timestamp
- Client-side generation avoids a database round trip before insert
- Supports custom _id values so a natural key can serve as the primary key
- Immutability guarantees a stable reference for the document's lifetime
AI Mentor Explanation
The _id field is like a player's unique registration number issued by the board the moment they're signed to a squad — every player gets one automatically, no two players ever share it, and it stays with them for their career. A franchise could instead register a player under a custom scout code, but either way that number becomes the guaranteed way to look them up.
Step-by-Step Explanation
Step 1
Automatic requirement
Every document must have an _id; if you omit it, the driver generates a 12-byte ObjectId before sending the insert.
Step 2
ObjectId structure
An ObjectId packs a 4-byte timestamp, a 5-byte random value, and a 3-byte counter, giving rough chronological sortability without a database round trip.
Step 3
Automatic unique index
MongoDB creates a unique index on _id automatically when a collection is created, guaranteeing no two documents in it can share the same _id.
Step 4
Custom _id values
You may supply your own _id (a string, number, or embedded document) as long as it's unique in the collection, letting a natural key act as the primary key.
Step 5
Immutability
Once set, _id cannot be changed on an existing document; changing it requires deleting and reinserting under the new _id.
What Interviewer Expects
- Knows _id is mandatory, unique, and automatically indexed
- Can describe the structure of a default ObjectId
- Understands that custom _id values are allowed and when that's useful
- Knows _id is immutable once a document exists
- Mentions that ObjectId generation happens client-side without a server round trip
Common Mistakes
- Thinking _id must always be an ObjectId and can't be a custom type
- Believing the _id index needs to be created manually
- Assuming ObjectIds guarantee exact global ordering rather than rough chronological ordering
- Trying to update an existing document's _id field directly
Best Answer (HR Friendly)
“The _id field is the built-in unique identifier every record in MongoDB automatically gets, similar to a primary key in traditional databases. It's generated for you if you don't provide one, and it's what MongoDB uses internally to guarantee no two records are ever mixed up.”
Code Example
// Auto-generated ObjectId
const res = db.users.insertOne({ name: 'Asha' });
// res.insertedId => ObjectId('66b1f2...')
// Custom _id using a natural key (email)
db.users.insertOne({ _id: '[email protected]', name: 'Asha' });
// Extracting the creation time embedded in an ObjectId
const id = ObjectId('66b1f2a53c1e4a2b9f0d1234');
print(id.getTimestamp()); // approximate document creation timeFollow-up Questions
- What are the three components encoded inside a default ObjectId?
- Can you change a document's _id after it has been inserted?
- When would you choose a custom _id over an auto-generated ObjectId?
- Does the _id index count against MongoDB's per-collection index limits?
- How does ObjectId generation avoid a round trip to the database?
MCQ Practice
1. What happens if you insert a document without specifying _id?
If _id is omitted, the driver automatically generates a 12-byte ObjectId before the document is inserted.
2. Can you use a custom string as a document's _id?
_id can be any BSON type, including a custom string or number, as long as it is unique within its collection.
3. Can an existing document's _id be updated?
_id is immutable; to change it you must delete the document and reinsert it under a new _id.
Flash Cards
What is the _id field? — The mandatory, unique, automatically indexed primary key of every MongoDB document.
What three parts make up a default ObjectId? — A 4-byte timestamp, a 5-byte random value, and a 3-byte incrementing counter.
Can _id be a custom value? — Yes, any unique BSON type is allowed, such as a string, number, or embedded document.
Is _id mutable after insertion? — No, it is immutable; changing it requires deleting and reinserting the document.