如何在 Firestore 中一次创建/更新多个文档
Posted
技术标签:
【中文标题】如何在 Firestore 中一次创建/更新多个文档【英文标题】:How to create/update multiple documents at once in Firestore 【发布时间】:2018-03-19 00:27:53 【问题描述】:是否可以仅通过一个请求将多个文档存储在 Firestore 中? 使用此循环是可能的,但这会导致列表中的每个项目执行一次保存操作。
for (counter in counters)
val counterDocRef = FirebaseFirestore.getInstance()
.document("users/$auth.currentUser!!.uid/lists/$listId/counters/$counter.id")
val counterData = mapOf(
"name" to counter.name,
"score" to counter.score,
)
counterDocRef.set(counterData)
【问题讨论】:
【参考方案1】:来自 Firebase 文档:
您还可以使用 set()、update() 或 delete() 方法的任意组合,将多个操作作为单个批处理执行。您可以跨多个文档批量写入,并且批处理中的所有操作都以原子方式完成。
// Get a new write batch
WriteBatch batch = db.batch();
// Set the value of 'NYC'
DocumentReference nycRef = db.collection("cities").document("NYC");
batch.set(nycRef, new City());
// Update the population of 'SF'
DocumentReference sfRef = db.collection("cities").document("SF");
batch.update(sfRef, "population", 1000000L);
// Delete the city 'LA'
DocumentReference laRef = db.collection("cities").document("LA");
batch.delete(laRef);
// Commit the batch
batch.commit().addOnCompleteListener(new OnCompleteListener<Void>()
@Override
public void onComplete(@NonNull Task<Void> task)
// ...
);
Firestore multiple write operations
希望对你有帮助..
【讨论】:
是的,这正是我一直在寻找的,不幸的是在文档中遗漏了。 有没有办法批量读取,类似于这种写入能力,即如果我有 10 个文档引用,我可以批量获取它们吗?谢谢! @MarcelBochtler 文档中没有提到批处理操作按单次读取计费。批处理是一种以原子方式执行操作的方法(一次全部执行或根本不执行),但这与计费不同。我在回答中引用的计费页面清楚地表明“您需要为使用 Cloud Firestore 执行的每个文档读取、写入和删除付费。” @DougStevenson 我的问题没有提到计费。所以这个答案解决了我所说的问题。无论如何,在我的测试中,我看到一批具有多次写入的费用仅计为一次写入。但这可能会改变,因为就像你说的,这不是它的记录方式。 帐单可能已更改。从我今天看到的情况来看,一批中的每次写入都作为一个实体写入收费。【参考方案2】:更新集合中所有文档的一些属性:
resetScore(): Promise<void>
return this.usersCollectionRef.ref.get().then(resp =>
console.log(resp.docs)
let batch = this.afs.firestore.batch();
resp.docs.forEach(userDocRef =>
batch.update(userDocRef.ref, 'score': 0, 'leadsWithSalesWin': 0, 'leadsReported': 0);
)
batch.commit().catch(err => console.error(err));
).catch(error => console.error(error))
【讨论】:
【参考方案3】:void createServiceGroups()
List<String> serviceGroups = [];
serviceGroups.addAll([
'Select your Service Group',
'Cleaning, Laundry & Maid Services',
'Movers / Relocators',
'Electronics & Gadget',
'Home Improvement & Maintenance',
'Beauty, Wellness & Nutrition',
'Weddings',
'Food & Beverage',
'Style & Apparel',
'Events & Entertainment',
'Photographer & Videographers',
'Health & Fitness',
'Car Repairs & Maintenance',
'Professional & Business Services',
'Language Lessons',
'Professional & Hobby Lessons',
'Academic Lessons',
]);
Firestore db = Firestore.instance;
// DocumentReference ref = db
// .collection("service_groups")
// .document(Random().nextInt(10000).toString());
// print(ref.documentID);
// Get a new write batch
for (var serviceGroup in serviceGroups)
createDocument(db, "name", serviceGroup);
print("length $serviceGroups.length");
createDocument(Firestore db, String k, String v)
WriteBatch batch = db.batch();
batch.setData(db.collection("service_groups").document(), k: v);
batch.commit();
createDocument(Firestore db, String k, String v)
WriteBatch batch = db.batch();
batch.setData(db.collection("service_groups").document(), k: v);
batch.commit();
这可能对你有帮助:
for (var serviceGroup in serviceGroups)
createDocument(db, "name", serviceGroup );
【讨论】:
【参考方案4】:如果你需要使用add()代替set,请按照下面的代码,
public void createMany(List<T> datas) throws CustomException
Firestore firestore = connection.firestore();
CollectionReference colRef = firestore.collection("groups");
WriteBatch batch = firestore.batch();
for (T data : datas)
batch.create(colRef.document(), data);
ApiFuture<List<WriteResult>> futureList = batch.commit();
try
for (WriteResult result : futureList.get())
logger.debug("Batch output: ", result.getUpdateTime());
catch (InterruptedException | ExecutionException e)
throw new CustomException(500, e.getMessage());
当您需要从 firestore db 生成 id 时,这可能很有用。
【讨论】:
batch.create(...)
不可用。看***.com/a/46739496/8468233 看看批量创建是如何完成的以上是关于如何在 Firestore 中一次创建/更新多个文档的主要内容,如果未能解决你的问题,请参考以下文章