Upsert behavior (update or insert) in MongoDB - Time & Space Complexity
Start learning this pattern below
Jump into concepts and practice - no test required
When using upsert in MongoDB, we want to know how the time to complete the operation changes as the data grows.
We ask: How does MongoDB find and update or insert a document as the collection gets bigger?
Analyze the time complexity of the following code snippet.
db.collection.updateOne(
{ _id: 123 },
{ $set: { name: "Alice" } },
{ upsert: true }
)
This code tries to find a document with _id 123. If found, it updates the name. If not, it inserts a new document with _id 123 and name "Alice".
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Searching the collection for a document matching the filter {_id: 123}.
- How many times: This search happens once per upsert operation.
As the collection grows, finding the document can take longer if there is no index on _id.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks if no index |
| 100 | About 100 checks if no index |
| 1000 | About 1000 checks if no index |
Pattern observation: Without an index, the search grows linearly with the number of documents. With an index, the search is much faster and does not grow linearly.
Time Complexity: O(log n)
This means the time to find and update or insert a document grows slowly as the collection grows, thanks to indexing.
[X] Wrong: "Upsert always takes the same time no matter how big the collection is."
[OK] Correct: The time depends on how MongoDB finds the document. Without an index, it checks many documents, so it takes longer as the collection grows.
Understanding how upsert works and its time cost helps you explain database efficiency clearly and confidently in real-world situations.
"What if we removed the index on _id? How would the time complexity of the upsert change?"
Practice
upsert option do in a MongoDB updateOne operation?Solution
Step 1: Understand the upsert option
The upsert option in MongoDB means update if found, insert if not found.Step 2: Apply to updateOne operation
When using updateOne with upsert: true, MongoDB updates the matching document or inserts a new one if none matches.Final Answer:
It updates a document if it exists, or inserts a new one if it does not. -> Option BQuick Check:
Upsert = update or insert [OK]
- Thinking upsert only inserts without updating
- Confusing upsert with delete operation
- Assuming upsert duplicates documents
updateOne in MongoDB?Solution
Step 1: Recall the updateOne method parameters
The updateOne method takes a filter, an update document, and an options object.Step 2: Identify the correct option for upsert
The option to enable upsert is {upsert: true}, which tells MongoDB to insert if no match is found.Final Answer:
db.collection.updateOne(filter, update, {upsert: true}) -> Option CQuick Check:
Use upsert: true in options [OK]
- Using {insert: true} instead of {upsert: true}
- Omitting the options object entirely
- Confusing update with replace option
users with documents:{ _id: 1, name: "Alice", age: 25 }What will be the result after running:
db.users.updateOne({ _id: 2 }, { $set: { name: "Bob", age: 30 } }, { upsert: true })and then querying
db.users.find().toArray()?Solution
Step 1: Understand the updateOne with upsert
The filter looks for _id: 2, which does not exist, so upsert inserts a new document with _id: 2 and the given fields.Step 2: Check existing documents
The original document with _id: 1 remains unchanged, so the collection now has two documents.Final Answer:
[{ _id: 1, name: "Alice", age: 25 }, { _id: 2, name: "Bob", age: 30 }] -> Option AQuick Check:
Upsert inserts missing document, keeps existing [OK]
- Assuming existing documents get deleted
- Thinking upsert only updates existing documents
- Expecting only the new document after upsert
db.products.updateOne({ sku: "123" }, { price: 19.99 })What is the likely error?
Solution
Step 1: Check the updateOne parameters
The updateOne call lacks the options object with upsert: true, so it only updates existing documents.Step 2: Confirm upsert behavior
Without upsert: true, no new document is inserted if the filter finds no match.Final Answer:
Missing the upsert: true option in the updateOne call. -> Option DQuick Check:
Upsert option needed to insert new docs [OK]
- Forgetting to add upsert option
- Confusing missing $set with upsert behavior
- Believing updateOne cannot upsert
status field to "active" for a user with email: "user@example.com". If no such user exists, insert a new document with email and status. Which MongoDB command correctly achieves this?Solution
Step 1: Identify the correct update syntax with upsert
To update or insert, use updateOne with a filter, an update using $set, and {upsert: true} option.Step 2: Check each option
db.users.updateOne({ email: "user@example.com" }, { $set: { status: "active" } }, { upsert: true }) uses $set and upsert correctly. db.users.insertOne({ email: "user@example.com", status: "active" }) only inserts, no update. db.users.updateOne({ email: "user@example.com" }, { status: "active" }, { upsert: true }) misses $set operator, which replaces the whole document incorrectly. db.users.updateMany({ email: "user@example.com" }, { $set: { status: "active" } }) updates many but no upsert.Final Answer:
db.users.updateOne({ email: "user@example.com" }, { $set: { status: "active" } }, { upsert: true }) -> Option AQuick Check:
Use updateOne + $set + upsert: true [OK]
- Omitting $set causing document replacement
- Using insertOne which does not update
- Forgetting upsert option for insert fallback
