The $slice modifier with $push helps you add items to an array but keep the array size limited. It removes extra items to keep only the newest or oldest ones.
When you want to keep only the last 5 messages in a chat history array.
When you add new scores to a list but want to keep only the top 10 recent scores.
When you store recent user activities but want to limit the list size to save space.
When you want to add new items to a log but keep only the latest entries.
3. Given the document { _id: 1, items: [1, 2, 3, 4] }, what will be the items array after running this update? db.collection.updateOne({ _id: 1 }, { $push: { items: { $each: [5, 6], $slice: -4 } } })
medium
A. [3, 4, 5, 6]
B. [1, 2, 3, 4, 5, 6]
C. [2, 3, 4, 5]
D. [5, 6]
Solution
Step 1: Understand $each and $slice with negative value
$each adds [5, 6] to the array. $slice: -4 keeps the last 4 elements of the array.
Step 2: Calculate new array content
Original array: [1, 2, 3, 4] After push: [1, 2, 3, 4, 5, 6] Apply $slice: -4: keep last 4 elements -> [3, 4, 5, 6]
Final Answer:
[3, 4, 5, 6] -> Option A
Quick Check:
Negative $slice keeps last elements [OK]
Hint: Negative $slice keeps last N elements [OK]
Common Mistakes:
Ignoring $slice and keeping all elements
Using positive $slice logic incorrectly
Removing new elements instead of old
4. You run this update: db.collection.updateOne({ _id: 2 }, { $push: { logs: { $each: ["a", "b"], $slice: 1 } } }) But the array logs ends up with 1 element that is an old one instead of a newly pushed one. What is the likely mistake?
medium
A. Not specifying $position causes elements to append incorrectly
B. Missing $each causes syntax error
C. Using $slice with a negative number causes array to clear
D. Using positive $slice keeps first elements instead of newest ones
Solution
Step 1: Understand positive $slice behavior
Positive $slice: 1 keeps only the first element of the array after push.
Step 2: Why old elements remain
Positive $slice: 1 keeps the first (oldest) element of the resulting array since new elements are appended to the end.
Step 3: Common confusion
Positive $slice keeps elements from the start, so if you want to keep the latest elements, use negative $slice.
Final Answer:
Using positive $slice keeps first elements instead of newest ones -> Option D
Quick Check:
Positive $slice keeps start elements [OK]
Hint: Use negative $slice to keep newest elements [OK]
Common Mistakes:
Confusing positive and negative $slice behavior
Omitting $each inside $push
Expecting $slice to remove elements before push
5. You want to keep only the 5 most recent messages in a chat array after adding new messages ["msg4", "msg5"]. The current array is ["msg1", "msg2", "msg3", "msg4"]. Which update query correctly achieves this?