Bird
Raised Fist0
Firebasecloud~20 mins

Firestore trigger functions in Firebase - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Firestore Trigger Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ query_result
intermediate
2:00remaining
What does this Firestore trigger function log?
Consider this Firestore trigger function that runs when a document is created in the 'users' collection:
exports.logNewUser = functions.firestore.document('users/{userId}').onCreate((snap, context) => {  const newUser = snap.data();  console.log('New user email:', newUser.email);  return null;});

What will be logged if a new user document with {email: 'alice@example.com'} is added?
Firebase
exports.logNewUser = functions.firestore.document('users/{userId}').onCreate((snap, context) => {
  const newUser = snap.data();
  console.log('New user email:', newUser.email);
  return null;
});
AError: snap.data is not a function
BNew user email: undefined
CNew user email: alice@example.com
DNo output, function does not run on create
Attempts:
2 left
💡 Hint
Remember that snap.data() returns the document data when a document is created.
📝 Syntax
intermediate
2:00remaining
Identify the syntax error in this Firestore trigger
Which option contains the correct syntax for a Firestore onUpdate trigger on the 'orders' collection?
Afunctions.firestore.document('orders/{orderId}').onUpdate((change, context) => { return null; })
Bfunctions.firestore.document('orders/{orderId}').onUpdate((change, context) => { return null; }
Cfunctions.firestore.document('orders/{orderId}').onUpdate(change, context) => { return null; }
Dfunctions.firestore.document('orders/{orderId}').onUpdate((change, context) => return null; )
Attempts:
2 left
💡 Hint
Check the arrow function syntax and parentheses.
❓ optimization
advanced
3:00remaining
Optimize this Firestore trigger to reduce reads
This Firestore onWrite trigger reads the same document twice:
exports.updateStats = functions.firestore.document('posts/{postId}').onWrite(async (change, context) => {  const postId = context.params.postId;  const doc1 = await admin.firestore().collection('posts').doc(postId).get();  const doc2 = await admin.firestore().collection('posts').doc(postId).get();  // ... use doc1 and doc2 ...  return null;});

Which option optimizes the code to avoid duplicate reads?
Firebase
exports.updateStats = functions.firestore.document('posts/{postId}').onWrite(async (change, context) => {
  const postId = context.params.postId;
  const doc1 = await admin.firestore().collection('posts').doc(postId).get();
  const doc2 = await admin.firestore().collection('posts').doc(postId).get();
  // ... use doc1 and doc2 ...
  return null;
});
AUse a single get() call and reuse the result: const doc = await ...get(); then use doc twice.
BReplace get() with onSnapshot() to listen for changes.
CCall get() twice but cache the second call result in a variable.
DUse two separate get() calls but add a delay between them.
Attempts:
2 left
💡 Hint
Reading the same document twice wastes reads and time.
🔧 Debug
advanced
3:00remaining
Why does this Firestore trigger not run?
A developer wrote this Firestore trigger:
exports.onDeleteUser = functions.firestore.document('users/{userId}').onDelete((snap, context) => {  console.log('User deleted:', snap.id);  return null;});

But it never logs anything when a user document is deleted. What is the most likely reason?
Firebase
exports.onDeleteUser = functions.firestore.document('users/{userId}').onDelete((snap, context) => {
  console.log('User deleted:', snap.id);
  return null;
});
Asnap.id is undefined in onDelete triggers.
BThe function is not deployed or not enabled in Firebase console.
ConDelete triggers require a different event name.
DThe function must return a promise, returning null causes it to not run.
Attempts:
2 left
💡 Hint
Check deployment and activation status of the function.
🧠 Conceptual
expert
2:30remaining
Which Firestore trigger type can access both before and after data?
You want to write a Firestore trigger that runs when a document is updated and needs to compare the document's data before and after the update.
Which trigger type should you use?
AonWrite trigger
BonDelete trigger
ConCreate trigger
DonUpdate trigger
Attempts:
2 left
💡 Hint
Only some triggers provide both previous and new data snapshots.

Practice

(1/5)
1. What does a Firestore trigger function do in a Firebase project?
easy
A. Deletes Firestore data without any event
B. Manually updates Firestore data when called
C. Creates a new Firestore database
D. Automatically runs code when data changes in Firestore

Solution

  1. Step 1: Understand Firestore triggers

    Firestore triggers are special functions that run automatically when data changes in Firestore.
  2. Step 2: Identify the trigger's purpose

    They help keep your app reactive by running code on create, update, or delete events without manual calls.
  3. Final Answer:

    Automatically runs code when data changes in Firestore -> Option D
  4. Quick Check:

    Firestore triggers = automatic code run on data change [OK]
Hint: Triggers run code automatically on Firestore data changes [OK]
Common Mistakes:
  • Thinking triggers run manually
  • Confusing triggers with database creation
  • Assuming triggers delete data without events
2. Which of the following is the correct syntax to create a Firestore trigger for document creation in Node.js Firebase Functions?
easy
A. exports.onCreate = functions.firestore.document('users').onCreate((snap, context) => { });
B. exports.onCreate = functions.firestore.document('users/{userId}').onCreate((snap, context) => { });
C. functions.firestore.onCreate('users/{userId}', (snap, context) => { });
D. functions.firestore.document('users/{userId}').create((snap, context) => { });

Solution

  1. Step 1: Recall Firestore trigger syntax

    The correct syntax uses exports, functions.firestore.document(path).onCreate(handler).
  2. Step 2: Match syntax to options

    exports.onCreate = functions.firestore.document('users/{userId}').onCreate((snap, context) => { }); matches this pattern exactly with document path and onCreate event.
  3. Final Answer:

    exports.onCreate = functions.firestore.document('users/{userId}').onCreate((snap, context) => { }); -> Option B
  4. Quick Check:

    Correct Firestore onCreate syntax = exports.onCreate = functions.firestore.document('users/{userId}').onCreate((snap, context) => { }); [OK]
Hint: Use exports with document(path).onCreate(handler) for create triggers [OK]
Common Mistakes:
  • Missing exports keyword
  • Using onCreate directly on firestore without document
  • Wrong method name like create instead of onCreate
3. Given this Firestore trigger function, what will be logged when a document is updated?
exports.logUpdate = functions.firestore.document('posts/{postId}').onUpdate((change, context) => {
  const before = change.before.data();
  const after = change.after.data();
  console.log('Title before:', before.title);
  console.log('Title after:', after.title);
});
medium
A. Logs the title before and after the update
B. Logs only the new title after update
C. Logs only the old title before update
D. Throws an error because change.before is undefined

Solution

  1. Step 1: Understand onUpdate trigger parameters

    The onUpdate trigger receives a change object with before and after snapshots of the document.
  2. Step 2: Analyze the console logs

    The code logs before.title and after.title, so both old and new titles are printed.
  3. Final Answer:

    Logs the title before and after the update -> Option A
  4. Quick Check:

    onUpdate logs before and after data [OK]
Hint: onUpdate provides before and after data snapshots [OK]
Common Mistakes:
  • Assuming only new data is available
  • Thinking change.before is undefined
  • Confusing onUpdate with onCreate
4. Identify the error in this Firestore trigger function code:
exports.deleteUser = functions.firestore.document('users/{userId}').onDelete((snap, context) => {
  const userData = snap.data;
  console.log('Deleted user:', userData.name);
});
medium
A. Missing async keyword for the function
B. onDelete trigger cannot be used on 'users/{userId}' path
C. snap.data should be snap.data() to get document data
D. context parameter is not allowed in onDelete triggers

Solution

  1. Step 1: Check how to access document data

    Firestore document snapshot data is accessed by calling snap.data(), not snap.data property.
  2. Step 2: Identify the error in code

    The code uses snap.data without parentheses, causing undefined userData and runtime error.
  3. Final Answer:

    snap.data should be snap.data() to get document data -> Option C
  4. Quick Check:

    Use snap.data() method to access document data [OK]
Hint: Use snap.data() method, not snap.data property [OK]
Common Mistakes:
  • Using snap.data instead of snap.data()
  • Thinking onDelete can't use context parameter
  • Assuming async is always required
5. You want to create a Firestore trigger that updates a user's profile summary whenever their profile document changes. Which approach correctly ensures the trigger only runs when the 'bio' field changes, avoiding infinite loops?
hard
A. Use onUpdate trigger and compare change.before.data().bio with change.after.data().bio before updating
B. Use onWrite trigger and update the document unconditionally inside the trigger
C. Use onCreate trigger to update bio field after document creation
D. Use onUpdate trigger and update the document without checking any field changes

Solution

  1. Step 1: Choose the right trigger for updates

    onUpdate triggers run on any document update, suitable for detecting changes.
  2. Step 2: Prevent infinite loops by checking field changes

    Compare bio field before and after update; only proceed if bio changed to avoid recursive updates.
  3. Final Answer:

    Use onUpdate trigger and compare change.before.data().bio with change.after.data().bio before updating -> Option A
  4. Quick Check:

    Check field changes in onUpdate to avoid loops [OK]
Hint: Compare before and after fields in onUpdate to avoid loops [OK]
Common Mistakes:
  • Using onWrite and updating unconditionally causing loops
  • Using onCreate which triggers only once
  • Not checking field changes before updating
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard