📖 Scenario: You are building a chat application where users can subscribe to messages from specific chat rooms.To avoid receiving all messages, you want to filter subscriptions so users only get messages from the rooms they follow.
🎯 Goal: Create a GraphQL subscription that filters messages by roomId so subscribers only receive messages from their chosen chat room.
📋 What You'll Learn
Define a GraphQL type Message with fields id, content, and roomId.
Create a subscription field messageAdded that accepts a roomId argument.
Implement filtering logic in the subscription resolver to only send messages matching the roomId argument.
Use a simple in-memory message list to simulate message publishing.
💡 Why This Matters
🌍 Real World
Filtering subscriptions is essential in real-time apps like chat, notifications, or live updates to avoid sending unnecessary data.
💼 Career
Understanding subscription filtering is important for backend developers working with GraphQL APIs to optimize data flow and user experience.
Progress0 / 4 steps
1
Define the Message type and initial messages
Create a GraphQL type called Message with fields id (ID!), content (String!), and roomId (ID!). Then create a variable called messages as a list with these exact entries: { id: "1", content: "Hello Room 1", roomId: "room1" } and { id: "2", content: "Hello Room 2", roomId: "room2" }.
GraphQL
Hint
Define the Message type with the three fields exactly. Then create a constant messages array with the two message objects.
2
Add the subscription field with roomId argument
Add a subscription field called messageAdded that takes an argument roomId of type ID! and returns a Message.
GraphQL
Hint
Define a Subscription type with a field messageAdded that takes roomId as an argument and returns a Message.
3
Implement subscription resolver with filtering
Create a subscription resolver for messageAdded that filters messages by the roomId argument. Use a function called withFilter that takes a pubsub.asyncIterator('MESSAGE_ADDED') and a filter function comparing payload.messageAdded.roomId with variables.roomId.
GraphQL
Hint
Use withFilter to wrap pubsub.asyncIterator('MESSAGE_ADDED') and filter by comparing payload.messageAdded.roomId with variables.roomId.
4
Publish messages with roomId to trigger filtered subscriptions
Add a function called addMessage that takes id, content, and roomId, pushes the new message to messages, and calls pubsub.publish('MESSAGE_ADDED', { messageAdded: newMessage }).
GraphQL
Hint
Create a function addMessage that adds a new message to messages and publishes it with pubsub.publish.
Practice
(1/5)
1. What is the main purpose of subscription filtering in GraphQL subscriptions?
easy
A. To batch multiple queries into one request
B. To store data permanently in the database
C. To receive only relevant real-time updates based on specified conditions
D. To convert queries into mutations automatically
Solution
Step 1: Understand subscription filtering concept
Subscription filtering allows clients to specify conditions so they only get updates they care about.
Step 2: Compare options with concept
Only To receive only relevant real-time updates based on specified conditions describes receiving relevant real-time updates, which matches subscription filtering.
Final Answer:
To receive only relevant real-time updates based on specified conditions -> Option C
Quick Check:
Subscription filtering = relevant updates [OK]
Hint: Filtering means getting only updates you want [OK]
Common Mistakes:
Confusing filtering with data storage
Thinking filtering batches queries
Assuming filtering changes query types
2. Which of the following is the correct syntax to add a filter argument to a GraphQL subscription named newMessages that filters by userId?
easy
A. subscription { newMessages(userId: "123") { id content } }
B. subscription { newMessages(filter: { userId: "123" }) { id content } }
C. subscription { newMessages(where: userId = "123") { id content } }
D. subscription { newMessages(user_id: "123") { id content } }
Solution
Step 1: Identify correct filter argument syntax
GraphQL subscriptions commonly use a filter argument with an object specifying conditions.
Step 2: Match options to syntax
subscription { newMessages(filter: { userId: "123" }) { id content } } uses filter: { userId: "123" }, which is the correct way to pass filter conditions.
Final Answer:
subscription { newMessages(filter: { userId: "123" }) { id content } } -> Option B
It returns no updates even when new comments are added to post 42. What is the likely issue?
medium
A. The filter argument is missing the correct type or schema support
B. Subscription queries cannot have filters
C. The filter field name should be post_id instead of postId
D. The subscription name newComments is invalid
Solution
Step 1: Check filter usage in subscription
Filters require the schema to support filtering on the specified field and type.
Step 2: Identify why no updates appear
If the schema does not support filtering by postId, the filter silently blocks updates.
Final Answer:
The filter argument is missing the correct type or schema support -> Option A
Quick Check:
Schema must support filter fields for updates [OK]
Hint: Check schema supports filter fields used [OK]
Common Mistakes:
Assuming field name casing is always wrong
Believing filters are not allowed in subscriptions
Thinking subscription name causes no updates
5. You want to subscribe to real-time updates of tasks but only for tasks assigned to user ID 7 and with priority "HIGH". Which subscription filter is correct?
hard
A. subscription { tasks(filter: { assignedUserId: 7, priority: "HIGH" }) { id title } }
B. subscription { tasks(filter: { assignedUserId: "7", priority: HIGH }) { id title } }
C. subscription { tasks(filter: { assignedUser: 7, priority: "HIGH" }) { id title } }
D. subscription { tasks(filter: { userId: 7, priority: "HIGH" }) { id title } }
Solution
Step 1: Match filter fields to requirements
The filter must use assignedUserId for user ID 7 and priority as "HIGH" string.
Step 2: Check option correctness
subscription { tasks(filter: { assignedUserId: 7, priority: "HIGH" }) { id title } } correctly uses numeric 7 and string "HIGH" with proper field names.
Final Answer:
subscription { tasks(filter: { assignedUserId: 7, priority: "HIGH" }) { id title } } -> Option A
Quick Check:
Correct fields and types in filter = subscription { tasks(filter: { assignedUserId: 7, priority: "HIGH" }) { id title } } [OK]
Hint: Use exact field names and correct value types in filter [OK]
Common Mistakes:
Using wrong field names like userId instead of assignedUserId
Mixing string and number types incorrectly
Omitting quotes around string values
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.