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
Pretty Printing and Cursor Behavior in MongoDB
📖 Scenario: You are managing a small library database using MongoDB. You want to list all books in a readable format and understand how to work with the cursor that MongoDB returns when you query the collection.
🎯 Goal: Learn how to pretty print query results in MongoDB shell and how to use the cursor to iterate over documents.
📋 What You'll Learn
Create a collection called books with specific documents
Use a variable to hold the cursor returned by a query
Use the pretty() method to display documents in a readable format
Use the cursor's hasNext() and next() methods to iterate documents
💡 Why This Matters
🌍 Real World
Managing and querying collections in MongoDB is common in web applications, content management, and data analysis.
💼 Career
Understanding cursor behavior and pretty printing helps developers and database administrators efficiently retrieve and display data.
Progress0 / 4 steps
1
Create the books collection with sample documents
Insert three documents into the books collection with these exact fields and values: { title: "The Hobbit", author: "J.R.R. Tolkien", year: 1937 }, { title: "1984", author: "George Orwell", year: 1949 }, and { title: "To Kill a Mockingbird", author: "Harper Lee", year: 1960 }.
MongoDB
Hint
Use db.books.insertMany() with an array of objects for the three books.
2
Assign the query result to a cursor variable
Create a variable called cursor and assign it the result of db.books.find() to get all documents from the books collection.
MongoDB
Hint
Use var cursor = db.books.find() to store the cursor.
3
Use pretty() to display documents nicely
Call the pretty() method on the cursor variable to display all documents in a readable format.
MongoDB
Hint
Call pretty() on the cursor variable like cursor.pretty().
4
Iterate over the cursor using hasNext() and next()
Write a while loop that uses cursor.hasNext() to check if there are more documents, and inside the loop call cursor.next() to get each document.
MongoDB
Hint
Use while (cursor.hasNext()) { cursor.next() } to loop through all documents.
Practice
(1/5)
1. What does the pretty() method do when used after a MongoDB query?
easy
A. Formats the output to be more readable with indentation and line breaks
B. Limits the number of documents returned by the query
C. Sorts the documents in ascending order
D. Deletes the documents matching the query
Solution
Step 1: Understand the purpose of pretty()
The pretty() method formats the output of a query to make it easier to read by adding indentation and line breaks.
Step 2: Compare with other options
Limiting, sorting, or deleting documents are done by other methods like limit(), sort(), or remove(), not pretty().
Final Answer:
Formats the output to be more readable with indentation and line breaks -> Option A
Quick Check:
pretty() improves readability [OK]
Hint: Remember: pretty() just makes output look nicer [OK]
Common Mistakes:
Confusing pretty() with limit() or sort()
Thinking pretty() changes the data
Assuming pretty() affects query results count
2. Which of the following is the correct syntax to check if a MongoDB cursor has more documents to iterate?
easy
A. cursor.hasMore()
B. cursor.hasNext()
C. cursor.nextExists()
D. cursor.more()
Solution
Step 1: Recall cursor methods in MongoDB
The correct method to check if a cursor has more documents is hasNext().
Step 2: Verify other options
Methods like hasMore(), nextExists(), or more() do not exist in MongoDB cursor API.
Final Answer:
cursor.hasNext() -> Option B
Quick Check:
Use hasNext() to check cursor availability [OK]
Hint: Use hasNext() to check cursor's next document [OK]
Common Mistakes:
Using non-existent cursor methods
Confusing hasNext() with next()
Assuming hasNext() returns the document itself
3. Given the following MongoDB shell commands, what will be the output?
var cursor = db.users.find({age: {$gt: 25}}).pretty();
while(cursor.hasNext()) {
printjson(cursor.next());
}
medium
A. No output because cursor.next() is missing parentheses
B. Syntax error because pretty() cannot be chained with find()
C. All user documents with age greater than 25 printed in readable JSON format
D. Only the first user document with age greater than 25 printed
Solution
Step 1: Analyze the query and cursor usage
The query finds users with age > 25 and applies pretty() to format output. The while loop uses hasNext() and next() to print each document.
Step 2: Understand the output behavior
Each matching document is printed in readable JSON format until no documents remain.
Final Answer:
All user documents with age greater than 25 printed in readable JSON format -> Option C
Quick Check:
Cursor iterates all matching docs with pretty print [OK]
Hint: pretty() formats output; hasNext() and next() iterate all [OK]
Common Mistakes:
Thinking pretty() breaks chaining
Assuming only one document prints
Forgetting to call next() as a function
4. You run this code in MongoDB shell:
var cursor = db.products.find().pretty();
if(cursor.hasNext) {
printjson(cursor.next());
}
What is the problem with this code?
medium
A. hasNext is used without parentheses, so it does not check correctly
B. pretty() cannot be used with find()
C. next() should be called before hasNext()
D. printjson() cannot print cursor documents
Solution
Step 1: Identify method usage errors
The method hasNext is used without parentheses, so it refers to the function itself, not its boolean result.
Step 2: Understand impact on code behavior
Because hasNext is not called, the if condition always evaluates to true (function exists), causing unexpected behavior.
Final Answer:
hasNext is used without parentheses, so it does not check correctly -> Option A
Quick Check:
Always call hasNext() with parentheses [OK]
Hint: Call hasNext() with () to get boolean result [OK]
Common Mistakes:
Using hasNext without parentheses
Thinking pretty() causes error
Calling next() before checking hasNext()
5. You want to print all documents from the orders collection where status is "shipped" in a readable format, but only 3 at a time to avoid memory overload. Which code snippet correctly achieves this?
hard
A. var cursor = db.orders.find({status: "shipped"}).batchSize(3); cursor.pretty(); while(cursor.hasNext()) { printjson(cursor.next()); }
B. var cursor = db.orders.find({status: "shipped"}).pretty(); for(var i=0; i<3; i++) { printjson(cursor.next()); }
C. var cursor = db.orders.find({status: "shipped"}).pretty(); while(cursor.hasNext()) { printjson(cursor.next()); if(i==3) break; }
D. var cursor = db.orders.find({status: "shipped"}).limit(3).pretty(); while(cursor.hasNext()) { printjson(cursor.next()); }
Solution
Step 1: Limit query results to 3 documents
Using limit(3) restricts the cursor to only 3 documents matching the filter.
Step 2: Use pretty() to format output and iterate with hasNext()/next()
Chaining pretty() formats output. The while loop prints each document until the 3 limited documents are exhausted.
Final Answer:
var cursor = db.orders.find({status: "shipped"}).limit(3).pretty(); while(cursor.hasNext()) { printjson(cursor.next()); } -> Option D
Quick Check:
limit(3) + pretty() + hasNext()/next() prints 3 formatted docs [OK]
Hint: Use limit(3) before pretty() and iterate with hasNext()/next() [OK]
Common Mistakes:
Not using limit() to restrict documents
Calling pretty() after iteration instead of chaining
Incorrect loop control causing infinite or missing output