Android 如何在Firestore中一次创建/更新多个文档

Android 如何在Firestore中一次创建/更新多个文档,android,firebase,google-cloud-firestore,Android,Firebase,Google Cloud Firestore,是否可以仅通过一个请求在Firestore中存储多个文档? 使用此循环是可能的,但这将导致列表中的每个项目执行一次保存操作 for (counter in counters) { val counterDocRef = FirebaseFirestore.getInstance() .document("users/${auth.currentUser!!.uid}/lists/${listId}/counters/${counter.id}") val

是否可以仅通过一个请求在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)
}

来自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) {
        // ...
    }
});
//获取新的写入批处理
WriteBatch batch=db.batch();
//设置“NYC”的值
DocumentReference nycRef=db.集合(“城市”).文件(“纽约市”);
batch.set(nycRef,new City());
//更新“SF”的人口
文件参考sfRef=db.集合(“城市”).文件(“SF”);
批量更新(sfRef,“总体”,1000000毫升);
//删除城市“LA”
DocumentReference laRef=数据库集合(“城市”)。文档(“LA”);
批量删除(laRef);
//提交批处理
batch.commit().addOnCompleteListener(新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
// ...
}
});


希望它能帮助..

更新集合中所有文档的某些属性:

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))
}
resetScore():承诺{
返回此.usersCollectionRef.ref.get()。然后(resp=>{
控制台日志(响应文档)
让batch=this.afs.firestore.batch();
resp.docs.forEach(userDocRef=>{
update(userDocRef.ref,{'score':0,'leadsWithSalesWin':0,'leadsReported':0});
})
batch.commit().catch(err=>console.error(err));
}).catch(错误=>console.error(错误))
}

这可能会帮助您:

 for (var serviceGroup in serviceGroups) {
      createDocument(db,  "name", serviceGroup  );
    }

如果您需要使用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());
    }
}
public void createMany(列表数据)引发CustomException{
Firestore=connection.Firestore();
CollectionReference colRef=firestore.collection(“组”);
WriteBatch batch=firestore.batch();
对于(T数据:数据){
创建(colRef.document(),数据);
}
ApiFuture-futureList=batch.commit();
试一试{
for(WriteResult结果:futureList.get()){
debug(“批处理输出:{}”,result.getUpdateTime());
}
}捕获(中断异常|执行异常e){
抛出新的CustomException(500,例如getMessage());
}
}

当您需要从firestore db生成id时,这可能会很有用。

是的,这正是我要查找的内容,不幸的是文档中遗漏了这一点。是否有一种批量读取的方法,类似于这种写入功能,即如果我有10个文档引用,我可以批量获取它们吗?谢谢@MarcelBochtler在文档中没有提到批处理操作是作为单次读取计费的。批处理是一种以原子方式执行操作的方法(一次执行或不执行),但这与计费不同。我在回答中引用的计费页面清楚地表明,“您使用Cloud Firestore执行的每个文档的读、写和删除都要向您收费。”@DougStevenson我的问题没有提到计费。所以这个答案解决了我所说的问题。无论如何,在我的测试中,我看到一批多个写操作只作为一次写操作收费。但这可能会改变,因为正如你所说,这不是它的记录方式。账单可能已经改变了。批处理中的每一次写入都按我今天看到的一个实体写入收费。
batch.create(…)
不可用。查看批处理创建是如何完成的
 for (var serviceGroup in serviceGroups) {
      createDocument(db,  "name", serviceGroup  );
    }
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());
    }
}