Firestore - batch.add 不是函数

Posted

技术标签:

【中文标题】Firestore - batch.add 不是函数【英文标题】:Firestore - batch.add is not a function 【发布时间】:2018-03-25 07:42:09 【问题描述】:

Firestore 批处理写入的 documentation 仅将 set()update()delete() 列为允许的操作。

有没有办法在批处理中添加add() 操作?我需要使用自动生成的 id 创建一个文档。

【问题讨论】:

【参考方案1】:

您可以分两步完成:

// 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' );

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

【讨论】:

如果我使用 .doc().set() 链,它会抛出 TypeError: batch.doc is not a function 是的,不要调用batch.doc(),正如你所见,我在批次之外的集合引用上调用.doc() 你是对的,它确实有效。我不知道.doc() 命令实际上会离线生成一个唯一ID,即没有服务器调用,或者至少没有在我的集合中创建一个空对象,这就是我想要包含add() 命令的全部意义在第一批中。谢谢!我会接受你的回答。 您需要引用 doc() 的“id”才能使其工作。像这样:db.collection('cities').doc().id 你应该调用 creat 而不是 set,因为如果 id 已经存在,你希望它会抛出一个错误【参考方案2】:

在我的例子中,使用 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()
  );

【讨论】:

【参考方案3】:

根据文档

在幕后,.add(...) 和 .doc().set(...) 是完全等价的,所以你可以使用哪个更方便。

也许这也适用于批次?

【讨论】:

不,您不需要在新文档上调用 .set()。 不知道以前是不是这样,但是现在有一个新的“creat”,如果文档已经存在,至少在后端,在前面,它会抛出错误结束是不可能的【参考方案4】:

PHP你可以试试:

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

【讨论】:

这个方法对我有用。这是 php 虽然 name: 'New York City' 谢谢@Gjaa,我已经修好了【参考方案5】:

创建对要在其中添加批处理数据的集合的引用 我们使用 forEach 遍历 req.body 并使用 set 方法设置要添加到集合中的每个数据

我们使用 commit 方法提交数据并将数据保存到集合中,并在成功时发送成功响应。

cloud firestore

【讨论】:

【参考方案6】:

假设您有城市列表并且您想批量编写它们。

 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();

【讨论】:

【参考方案7】:

Sam Stern 的回答是正确的方法,但如果您使用 AngularFire,则不能在没有参数的情况下使用 .doc() 来生成新的 docId(请参阅 https://github.com/angular/angularfire/issues/1974)。

AngularFire 的方法是:

// 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' );

【讨论】:

以上是关于Firestore - batch.add 不是函数的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:firestore.collection 不是函数(React、Redux、Firestore)

(firebase.firestore 不是函数)尝试在 Firestore 中创建集合时

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

尝试初始化 Cloud Firestore 时,firebase.firestore() 不是函数

Cloud Firestore 文档添加给出错误“参数“数据”的值不是有效的 Firestore 文档。不能使用“未定义”作为 Firestore 值”

Swift 5 Firestore:检查数据库中是不是存在集合