Bird
Raised Fist0
MongoDBquery~10 mins

Custom _id values in MongoDB - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Custom _id values
Start Insert Document
Check if _id provided?
NoGenerate default ObjectId
Yes
Use provided _id value
Insert document with _id
Document stored in collection
When inserting a document, MongoDB checks if you provide an _id. If yes, it uses that value; if no, it creates a default ObjectId.
Execution Sample
MongoDB
db.users.insertOne({_id: "user123", name: "Alice"})
Insert a document with a custom _id value 'user123' into the users collection.
Execution Table
StepActionCheck _idResulting _idInsert Status
1Start insert documentN/AN/APending
2Check if _id providedYes (_id = 'user123')Use 'user123'Pending
3Insert document with custom _idN/Auser123Success
4Document stored in collectionN/Auser123Complete
💡 Insertion completes using the provided custom _id 'user123'.
Variable Tracker
VariableStartAfter Step 2After Step 3Final
_idundefined"user123""user123""user123"
Insert StatusNot startedPendingSuccessComplete
Key Moments - 2 Insights
What happens if I do not provide an _id when inserting?
If no _id is provided (see execution_table step 2), MongoDB automatically generates a unique ObjectId for the document.
Can I use any value as a custom _id?
Yes, you can use any unique value as _id (string, number, etc.), but it must be unique in the collection to avoid insertion errors.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution_table, what _id value is used at step 3?
Anull
B"user123"
CA generated ObjectId
Dundefined
💡 Hint
Check the 'Resulting _id' column at step 3 in the execution_table.
At which step does MongoDB decide to use the provided _id?
AStep 2
BStep 1
CStep 3
DStep 4
💡 Hint
Look at the 'Check _id' column to see when the _id presence is checked.
If you omit _id in the insert, what changes in the execution_table?
AStep 3 fails with error
BStep 4 is skipped
CStep 2 shows 'No' and a generated ObjectId is used
DNothing changes
💡 Hint
Think about the flow when _id is not provided as shown in concept_flow.
Concept Snapshot
Insert documents with custom _id by specifying _id field.
If _id is missing, MongoDB creates a unique ObjectId.
Custom _id must be unique in the collection.
Use any data type for _id (string, number, etc.).
Insertion uses provided _id directly without modification.
Full Transcript
When you insert a document into MongoDB, it checks if you gave an _id value. If you did, it uses that as the document's unique identifier. If you didn't, MongoDB creates a unique ObjectId automatically. This _id is important because it uniquely identifies each document in the collection. You can use any value for _id, like a string or number, but it must be unique to avoid errors. The insertion process stores the document with the chosen _id in the collection.

Practice

(1/5)
1.

What is the purpose of the _id field in a MongoDB document?

easy
A. It uniquely identifies each document in a collection.
B. It stores the creation date of the document.
C. It holds the user's login information.
D. It contains the document's size in bytes.

Solution

  1. Step 1: Understand the role of _id in MongoDB

    The _id field is a unique identifier for each document in a collection, ensuring no two documents share the same _id.
  2. Step 2: Compare with other options

    Other options describe unrelated fields or metadata, not the unique identifier role.
  3. Final Answer:

    It uniquely identifies each document in a collection. -> Option A
  4. Quick Check:

    _id = unique document ID [OK]
Hint: Remember: _id means unique ID for each document [OK]
Common Mistakes:
  • Thinking _id stores creation date
  • Confusing _id with user data fields
  • Assuming _id is optional
2.

Which of the following is the correct way to insert a document with a custom _id value in MongoDB?

db.users.insertOne({ _id: 123, name: "Alice" })
easy
A. db.users.insertOne({ id: 123, name: "Alice" })
B. db.users.insertOne({ _id: 123, name: "Alice" })
C. db.users.insertOne({ _id: "name", name: "Alice" })
D. db.users.insertOne({ _id: ObjectId(), name: "Alice" })

Solution

  1. Step 1: Identify correct _id field usage

    The _id field must be named exactly _id to set a custom ID. db.users.insertOne({ _id: 123, name: "Alice" }) uses _id: 123 correctly.
  2. Step 2: Check other options for errors

    db.users.insertOne({ id: 123, name: "Alice" }) uses id instead of _id. db.users.insertOne({ _id: "name", name: "Alice" }) uses a string "name" which is valid but less meaningful here. db.users.insertOne({ _id: ObjectId(), name: "Alice" }) uses default ObjectId, not custom.
  3. Final Answer:

    db.users.insertOne({ _id: 123, name: "Alice" }) -> Option B
  4. Quick Check:

    Custom _id needs exact field name [OK]
Hint: Use exact field name _id for custom IDs [OK]
Common Mistakes:
  • Using id instead of _id
  • Confusing ObjectId() with custom values
  • Using invalid types for _id
3.

Given the following documents inserted into a collection:

<pre>db.products.insertMany([ { _id: "p1", name: "Pen" }, { _id: "p2", name: "Pencil" }, { _id: "p3", name: "Eraser" } ]) What will db.products.find({ _id: "p2" }).toArray() return?

medium
A. [{ _id: "p2", name: "Pencil" }]
B. [{ _id: "p1", name: "Pen" }]
C. []
D. Error: Invalid query

Solution

  1. Step 1: Understand the query filter

    The query searches for a document with _id equal to "p2".
  2. Step 2: Match the document in the collection

    The document with _id: "p2" has the name "Pencil" and exists in the collection.
  3. Final Answer:

    [{ _id: "p2", name: "Pencil" }] -> Option A
  4. Quick Check:

    Query by custom _id returns matching document [OK]
Hint: Query by exact _id returns matching document [OK]
Common Mistakes:
  • Expecting multiple documents returned
  • Confusing _id with other fields
  • Assuming query returns error for string _id
4.

Consider this insertion attempt:

db.orders.insertOne({ _id: 101, item: "Book" })
db.orders.insertOne({ _id: 101, item: "Notebook" })

What error will occur and why?

medium
A. SyntaxError due to missing quotes around _id value.
B. TypeError because _id must be a string.
C. No error; both documents inserted successfully.
D. DuplicateKeyError because _id must be unique.

Solution

  1. Step 1: Check uniqueness requirement of _id

    The _id field must be unique in a collection. Both documents use _id: 101.
  2. Step 2: Identify the error caused by duplicate _id

    Inserting the second document with the same _id causes a DuplicateKeyError.
  3. Final Answer:

    DuplicateKeyError because _id must be unique. -> Option D
  4. Quick Check:

    Duplicate _id causes insertion error [OK]
Hint: No two documents can share the same _id [OK]
Common Mistakes:
  • Thinking _id can repeat
  • Confusing syntax error with duplicate key error
  • Assuming _id must be string only
5.

You want to store user profiles with custom _id values based on their email addresses to speed up lookups. Which approach is best?

// Option A
{ _id: ObjectId(), email: "user@example.com", name: "User" }

// Option B
{ _id: "user@example.com", name: "User" }

// Option C
{ email: "user@example.com", name: "User" }

// Option D
{ _id: UUID(), email: "user@example.com", name: "User" }
hard
A. Use default ObjectId and store email separately.
B. Do not use _id, just store email field.
C. Set _id to the email string for direct lookup.
D. Use UUID as _id and email separately.

Solution

  1. Step 1: Understand the goal of custom _id

    The goal is to speed up lookups by using email as the unique identifier.
  2. Step 2: Evaluate options for best fit

    Setting _id to the email string enables direct lookup using the email as _id, making queries fast. Using default ObjectId or UUID with separate email requires additional indexing. Omitting _id is invalid since it is mandatory.
  3. Final Answer:

    Set _id to the email string for direct lookup. -> Option C
  4. Quick Check:

    Custom _id as email speeds queries [OK]
Hint: Use email as _id for fast direct lookups [OK]
Common Mistakes:
  • Ignoring _id uniqueness requirement
  • Using default IDs when custom IDs help
  • Not indexing email for fast queries