Firestore - batch.add is not a function

Google Cloud-Firestore

Google Cloud-Firestore Problem Overview


The documentation for Firestore batch writes lists only set(), update() and delete() as permitted operations.

Is there no way to add an add() operation to the batch? I need a document to be created with an auto-generated id.

Google Cloud-Firestore Solutions


Solution 1 - Google Cloud-Firestore

You can do this in two steps:

// Create a ref with auto-generated ID
var newCityRef = db.collection('cities').doc();

// ...

// Add it in the batch
batch.set(newCityRef, { name: 'New York City' });

The .doc() method does not write anything to the network or disk, it just makes a reference with an auto-generated ID you can use later.

Solution 2 - Google Cloud-Firestore

In my case, using AngularFire2, I had to use the batch.set() method, passing as first parameter the document reference with an ID previously created, and the reference attribute:

import { AngularFirestore } from '@angular/fire/firestore';
...
private afs: AngularFirestore
...
batch.set(
    this.afs.collection('estados').doc(this.afs.createId()).ref,
    er.getData()
  );

Solution 3 - Google Cloud-Firestore

According to the docs

> Behind the scenes, .add(...) and .doc().set(...) are completely equivalent, so you can use whichever is more convenient.

Perhaps this applies to batches as well?

Solution 4 - Google Cloud-Firestore

For PHP you can try :

$batch = $db->batch();
$newCityRef = $db->collection('cities')->newDocument();
$batch->set($newCityRef , [ 'name'=>'New York City' ]);

Solution 5 - Google Cloud-Firestore

I'll offer an answer for Firebase 9 in which the syntax differs from Firebase 8.

For Firebase 9, the equivalent of add() is addDoc() as explained at https://firebase.google.com/docs/firestore/manage-data/add-data#web-version-9_6 . It is for when you're not using batch nor transaction. As per the original problem posted, there is no equivalent of addDoc() on batch nor transaction on Firebase 9 either.

I found a way to achieve the equivalent of addDoc() for a batch on Firebase 9 by following the answer https://stackoverflow.com/a/69859144/2848676 as follows:

        const batch = writeBatch(db);
        const docADocRef = doc(collection(db, "DocA"));
        batch.set(docADocRef, {
           fieldA: "This is field of an instance of DocA"
        });
        const docBDocRef = doc(collection(db, "DocB"));
        batch.set(docBDocRef, {
           docAID: docADocRef.id
        });
        batch.commit();

In this example, instances of DocA and DocB are created and DocB receives a pointers to the DocA instance.

Solution 6 - Google Cloud-Firestore

Create the reference to the collection in which you are going to add the batch data We loop over the req.body using forEach and set the each data to be added in to the collection using the set method

We commit the data and save the data to the collection using the commit method and on success ,send a success response.

cloud firestore

Solution 7 - Google Cloud-Firestore

Lets assume that you have list of cities and you want to write them in batch.

 final CityList = FirebaseFirestore.instance.collection('cities')
 WriteBatch batch = FirebaseFirestore.instance.batch();
 for(CityList city in cities) {
    final newShoppingItem = ShoppingList.doc();
    batch.set(newShoppingItem, {
  'name': city.name,
  'createdAt': DateTime
      .now()
      .millisecondsSinceEpoch
});
}
 batch.commit();

Solution 8 - Google Cloud-Firestore

Sam Stern's answer is the correct way to do it, although if you are using AngularFire, .doc() cannot be used withouth a parameter to generate a new docId (see https://github.com/angular/angularfire/issues/1974).

The AngularFire way of doing this would be:

// Create a ref with auto-generated ID
const id = this.db.createId();
const newCityRef= this.db.collection("cities").doc(id);

// ...

// Add it in the batch
batch.set(newCityRef, { name: 'New York City' });

Solution 9 - Google Cloud-Firestore

This worked for me and it is mentioned in the docs for PHP

 $batch = $db->batch();

# Set the data for NYC
$nycRef = $db->collection('samples/php/cities')->document('NYC');
$batch->set($nycRef, [
    'name' => 'New York City'
]);

# Update the population for SF
$sfRef = $db->collection('samples/php/cities')->document('SF');
$batch->update($sfRef, [
    ['path' => 'population', 'value' => 1000000]
]);

# Delete LA
$laRef = $db->collection('samples/php/cities')->document('LA');
$batch->delete($laRef);

# Commit the batch
$batch->commit();

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
QuestionartoorasView Question on Stackoverflow
Solution 1 - Google Cloud-FirestoreSam SternView Answer on Stackoverflow
Solution 2 - Google Cloud-FirestoreSebastián de Prada GatoView Answer on Stackoverflow
Solution 3 - Google Cloud-Firestoresgt_lagrangeView Answer on Stackoverflow
Solution 4 - Google Cloud-FirestoreMujtabaFRView Answer on Stackoverflow
Solution 5 - Google Cloud-FirestoreMichael OsofskyView Answer on Stackoverflow
Solution 6 - Google Cloud-FirestoreVishnu BView Answer on Stackoverflow
Solution 7 - Google Cloud-FirestorebilalView Answer on Stackoverflow
Solution 8 - Google Cloud-FirestoreTobias KaufmannView Answer on Stackoverflow
Solution 9 - Google Cloud-FirestoreShoaib AhmedView Answer on Stackoverflow