FireStore create a document if not exist

node.jsFirebaseGoogle Cloud-Firestore

node.js Problem Overview


I want to update a doc like this:

db.collection('users').doc(user_id).update({foo:'bar'})

However, if the doc user_id does not exists, the above code will throw an error. Hence, how to tell Firestore to create the student if not exists, in other word, behave like this:

db.collection('users').doc(user_id).set({foo:'bar'})

node.js Solutions


Solution 1 - node.js

I think you want to use the following code:

db.collection('users').doc(user_id).set({foo:'bar'}, {merge: true})

This will set the document with the provided data and will leave other document fields intact. It is best when you're not sure whether the document exists. Simply pass the option to merge the new data with any existing document to avoid overwriting entire documents.

>For more detailed about managing data with firestore check this link

Solution 2 - node.js

If you need things like created and updated timestamps, you can use this technique:

let id = "abc123";
let email = "[email protected]";
let name = "John Doe";
let document = await firebase.firestore().collection("users").doc(id).get();
if (document && document.exists) {
  await document.ref.update({
    updated: new Date().toISOString()
  });
}
else {
  await document.ref.set({
    id: id,
    name: name,
    email: email,
    created: new Date().toISOString(),
    updated: new Date().toISOString()
  }, { merge: true });
}

This will create the document if it doesn't exist with created and updated timestamps, but only change the updated timestamp if it exists.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTSRView Question on Stackoverflow
Solution 1 - node.jsJ. DoeView Answer on Stackoverflow
Solution 2 - node.jsDale ZakView Answer on Stackoverflow