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 值”