Home > database >  Google Firestore Deleting Multiple Fields
Google Firestore Deleting Multiple Fields

Time:10-01

I have a firestore. I am trying to delete a specific record from the document 'idAvailable'. However, the id is not deleted from the idAvailable table when we hit this endpoint: http://localhost:5001/us-central1/reserveId which is defined in the below code snippet.

exports.reserveId = functions.https.onRequest(async (req, res) => {
  cors(req, res, ()=> {
    const documentId = "idAvailable"
    const setReserved = "idReserved"
    admin.firestore().collection("Vacancy").doc(documentId).get().then(doc => {

      const field = doc.data().ar[0]
      console.log("Field "   JSON.stringify(field))

      // No error but doesn't execute correctly
      const doDelete = db.collection("Vacancy").doc(documentId).update(field, admin.firestore.FieldValue.delete())

    res.send(doc.data().ar[0])

    }).catch(error => {
      res.send(error)
    })
  })
});

Specifically, this line:

const doDelete = db.collection("Vacancy").doc(documentId).update(field, admin.firestore.FieldValue.delete())

does not delete from the collection.

Why is this happening?

CodePudding user response:

Are you trying to delete an item from an array? You can use arrayRemove instead. Also you can use async-await syntax since your function is async:

exports.reserveId = functions.https.onRequest(async (req, res) => {
  cors(req, res, async () => {
    const documentId = "idAvailable"
    const setReserved = "idReserved"
    
    const snap = await admin.firestore().collection("Vacancy").doc(documentId).get()
    const field = snap.data().ar[0] // value of that array item
   
    await db.collection("Vacancy").doc(documentId).update({ ar: admin.firestore.FieldValue.arrayRemove(field) })

    res.send(doc.data().ar[0]) // response body is deleted from array
  })
});

Do note that if you know value of that item to be removed (exact same object/string), then you can use arrayRemove directly without fetching the document first.


If you want to delete multiple fields then you can pass an object like this:

await db.collection("Vacancy").doc(documentId).update({ 
  field1Name: admin.firestore.FieldValue.delete(),
  field2Name: admin.firestore.FieldValue.delete()
})
  • Related