我可以在Cloud Firestore中将add()和set()操作批处理在一起吗?

时间:2019-06-21 10:28:53

标签: javascript firebase google-cloud-firestore

Firebase docs,我们得到:

  

批量写入

     

如果不需要读取操作集中的任何文档,则可以将多个写操作作为一个批次执行,其中包含 set(),update()或delete()操作的任意组合。< / strong>一批写入可以自动完成,并且可以写入多个文档。

但就我而言,我需要确保执行add()操作(创建新文档)和执行set()操作以更新其他一些先前存在的文档。

有没有办法做到这一点?

注意:我正在使用Javascrip SDK。

3 个答案:

答案 0 :(得分:1)

如果愿意

 const batch = firestore().batch()
 const sampleRef = firestore().collection(‘sample’)
 const id = sampleRef.doc().id
 batch.set(sampleRef.doc(id), {...})
 batch.commit()

它应该起到欺骗作用,与添加相同

答案 1 :(得分:1)

只需使用CollectionReference的doc()方法,然后调用BatchedWrite的set()方法,以“模仿”对add()方法的调用,

摘录自https://firebase.google.com/docs/reference/js/firebase.firestore.CollectionReference#doc

  

如果未指定路径,则自动生成的唯一ID   将用于返回的DocumentReference

因此,您可以在批次中执行以下操作:

// Get a new write batch
var batch = db.batch();

// A "standard" Set
var nycRef = db.collection("cities").doc("NYC");
batch.set(nycRef, {name: "New York City"});

// A Set that is similar to an Add
var unknownCityRef = db.collection("cities").doc();
batch.set(unknownCityRef, {name: "Unknown City"});

// Commit the batch
batch.commit().then(function () {
    // ...
});

答案 2 :(得分:0)

为了使用批处理写入创建等同于add()的新文档,我们需要 首先使用angularfirestore中的createID()函数生成uid并设置批处理。

但是,更新现有文档非常简单。我们只需在设置批处理时提供其uid。

`

constructor(
    private angularFireStore: AngularFirestore,
   ) {}

 const batch = this.angularFireStore.firestore.batch();

 // generates the unique uid of 20 chars 
 const autogenUid = this.angularFireStore.createId();
 // this is new doc ref with newly generated uid
 const collectionReference = this.angularFireStore.collection
                            ('collection_name').doc(autogenUid).ref;

 const docData = {first_field:'value', second_field:'value2'};
 batch.set(collectionReference, docData);

 // to update existing , we simply need to know its uid beforehand, 
 const collection2Reference = this.angularFireStore.collection
                            ('collection2_name').doc('existingUid').ref;

 const docData2 = {first_field:'value', second_field:'value2'};
 batch.set(collection2Reference, docData2);

 batch.commit();