📖 Scenario: You are creating a small API for a bookstore. The data will be stored in MongoDB, and you will use GraphQL to query and manage the books.This project will guide you step-by-step to set up the data structure, configure the schema, write the main query, and complete the API setup.
🎯 Goal: Build a basic GraphQL API connected to MongoDB that allows querying a list of books with their titles and authors.
📋 What You'll Learn
Create a MongoDB collection with sample book data
Define a GraphQL schema with a Book type
Write a GraphQL query to fetch all books
Complete the API setup to connect schema and resolver
💡 Why This Matters
🌍 Real World
Many modern web applications use GraphQL APIs backed by MongoDB to efficiently query and manage data.
💼 Career
Understanding how to connect GraphQL with MongoDB is valuable for backend developers building flexible and scalable APIs.
Progress0 / 4 steps
1
DATA SETUP: Create MongoDB collection with sample books
Create a MongoDB collection called books with these exact documents: { title: "The Hobbit", author: "J.R.R. Tolkien" } and { title: "1984", author: "George Orwell" }.
GraphQL
Hint
Use insertMany on the books collection to add the two book documents.
2
CONFIGURATION: Define GraphQL Book type
Define a GraphQL type called Book with two fields: title and author, both of type String!.
GraphQL
Hint
Use type Book { title: String! author: String! } to define the type.
3
CORE LOGIC: Write a GraphQL query to fetch all books
Add a Query type with a field books that returns a list of Book objects: [Book!]!.
GraphQL
Hint
Define type Query { books: [Book!]! } to allow fetching all books.
4
COMPLETION: Connect resolver to fetch books from MongoDB
Write a resolver function for Query.books that returns all documents from the books MongoDB collection using db.collection('books').find().toArray().
GraphQL
Hint
Use an async resolver function that calls db.collection('books').find().toArray() to get all books.
Practice
(1/5)
1. What is the main purpose of using GraphQL with MongoDB?
easy
A. To store data in tables instead of documents
B. To replace MongoDB with a SQL database
C. To automatically backup MongoDB data
D. To query only the specific data fields needed from MongoDB
Solution
Step 1: Understand GraphQL's role
GraphQL allows clients to request exactly the data they want, no more, no less.
Step 2: Connect to MongoDB data
MongoDB stores flexible documents, and GraphQL queries these documents precisely.
Final Answer:
To query only the specific data fields needed from MongoDB -> Option D
Quick Check:
GraphQL queries = precise data retrieval [OK]
Hint: GraphQL fetches only requested fields from MongoDB [OK]
Common Mistakes:
Thinking GraphQL replaces MongoDB
Confusing document storage with tables
Assuming GraphQL handles backups
2. Which of the following is the correct way to define a GraphQL query to fetch a list of users from MongoDB?
easy
A. query { users { id name email } }
B. mutation { users { id name email } }
C. query users { id name email }
D. fetch users from MongoDB
Solution
Step 1: Identify GraphQL query syntax
GraphQL queries start with the keyword query followed by the selection set.
Step 2: Check the options
query { users { id name email } } correctly uses query { users { id name email } } to fetch user fields.
Final Answer:
query { users { id name email } } -> Option A
Quick Check:
GraphQL query syntax = query + selection set [OK]
Hint: Queries start with 'query' keyword, mutations with 'mutation' [OK]
Common Mistakes:
Using mutation instead of query for fetching data
Omitting braces or keywords
Writing invalid syntax like 'fetch users from MongoDB'
3. Given this GraphQL query to fetch a user by ID: query { user(id: "123") { name age } } And MongoDB has a user document { _id: "123", name: "Alice", age: 30, city: "NY" }, what will be the query result?
Hint: GraphQL returns only requested fields, ignoring others [OK]
Common Mistakes:
Expecting all document fields returned
Confusing id with _id field
Assuming error when user exists
4. You wrote this GraphQL mutation to add a new user: mutation { addUser(name: "Bob", age: "25") { id name } } But you get an error: "Field 'addUser' argument 'age' of type 'Int!' was provided invalid value." What is the likely cause?
medium
A. The mutation syntax is incorrect; should use query instead
B. The age argument is missing in the schema definition
C. The age argument was provided as a string, not an integer
D. The age value 25 is invalid because it is too low
Solution
Step 1: Analyze the error message
The error says the 'age' argument type is 'Int!' but the value is invalid.
Step 2: Analyze the query literal
The query provides age: "25" as a string literal, but the schema expects an integer literal for Int!, causing the invalid value error.
Final Answer:
The age argument was provided as a string, not an integer -> Option C
Quick Check:
Type mismatch in argument causes invalid value error [OK]
Hint: Match argument types exactly as schema defines [OK]
Common Mistakes:
Using query instead of mutation for data change
Ignoring schema argument types
Assuming numeric values are always valid
5. You want to update a user's city in MongoDB using GraphQL. The schema defines a mutation: updateUser(id: ID!, city: String!): User Which resolver code snippet correctly updates the city field in MongoDB?
hard
A. return UserModel.updateOne({ id }, { city });
B. return UserModel.findByIdAndUpdate(id, { city }, { new: true });
C. return UserModel.findOneAndDelete({ _id: id });
D. return UserModel.insertOne({ id, city });
Solution
Step 1: Identify correct MongoDB update method
findByIdAndUpdate updates a document by its _id and returns the updated document.
Step 2: Check options for update and return
return UserModel.findByIdAndUpdate(id, { city }, { new: true }); uses findByIdAndUpdate with { new: true } to return updated user, matching schema.
Final Answer:
return UserModel.findByIdAndUpdate(id, { city }, { new: true }); -> Option B
Quick Check:
Use findByIdAndUpdate to update and return new doc [OK]
Hint: Use findByIdAndUpdate with { new: true } to get updated doc [OK]
Common Mistakes:
Using updateOne without returning updated document
Deleting instead of updating
Inserting new document instead of updating existing
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.