Firestore - batch.add不是一个函数

art*_*ras 35 google-cloud-firestore

文件对公司的FireStore批量写入只列出set(),update()delete()允许的操作.

有没有办法向add()批处理添加操作?我需要使用自动生成的ID创建文档.

Sam*_*ern 79

您可以分两步完成此操作:

// 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' });
Run Code Online (Sandbox Code Playgroud)

.doc()方法不会向网络或磁盘写入任何内容,它只是使用您可以在以后使用的自动生成的ID进行引用.

  • 也许我来晚了,但现在(2022)你可以使用 `ref = doc(collection(Firestore, 'collectionName'))` 获取自动生成的 id 文档引用。此[链接](https://cloud.google.com/firestore/docs/manage-data/add-data#add_a_document)的第三个示例是它的参考。是的,如果提供的集合不存在,它确实会创建一个新集合。 (4认同)
  • 你是对的,它确实有效。我不知道 `.doc()` 命令实际上会离线生成一个唯一的 ID,即没有服务器调用,或者至少没有在我的集合中创建一个空对象,这就是我想要包含 ` add()` 命令首先在批处理中。谢谢!我会接受你的回答。 (2认同)
  • 你应该调用 creat 而不是 set,因为如果 id 已经存在,你希望它抛出一个错误 (2认同)
  • 最后不要忘记`batch.commit()` (2认同)

Mic*_*sky 11

我将为 Firebase 9 提供一个答案,其中语法与 Firebase 8 不同。

对于 Firebase 9,相当于add()https://firebase.google.com/docs/firestore/manage-data/add-data#web-version-9_6addDoc()的解释。它适用于当您不使用批处理事务时。根据发布的原始问题, Firebase 9 上也没有等效的批处理事务addDoc()

我找到了一种方法,可以通过遵循答案/sf/answers/4890140111/addDoc()来实现与 Firebase 9 上的批处理等效的效果,如下所示:

        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();
Run Code Online (Sandbox Code Playgroud)

在此示例中,创建了 DocA 和 DocB 的实例,并且 DocB 接收指向 DocA 实例的指针。


小智 5

就我而言,使用 AngularFire2,我必须使用 batch.set() 方法,将具有先前创建的 ID 的文档引用和引用属性作为第一个参数传递:

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