从Firebase docs,我们得到:
批量写入
如果不需要读取操作集中的任何文档,则可以将多个写操作作为一个批次执行,其中包含 set(),update()或delete()操作的任意组合。< / strong>一批写入可以自动完成,并且可以写入多个文档。
但就我而言,我需要确保执行add()
操作(创建新文档)和执行set()
操作以更新其他一些先前存在的文档。
有没有办法做到这一点?
注意:我正在使用Javascrip SDK。
答案 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();