Firestore的WriteBatch.update()不会采用angularfirestore2的AngularFirestoreDocument

时间:2019-06-29 03:53:07

标签: angularfire2

我正在尝试使用Firestore的WriteBatch进行批量写入。我试图将更新添加到WriteBatch,并且需要DocumentReference。我有一个AngularFirestoreDocument,无法弄清楚如何将其转换为DocumentReference并使其正确编译或运行。

我尝试将其转换为任何未知的DocumentReference并按原样使用AngularFirestoreDocument。

export class FinancialService {
    private transCollection: AngularFirestoreCollection<Transaction>;

    batch_update_trans(trans) {
        let writer = this.afs.firestore.batch();
        this.transCollection = this.afs.collection<Transaction>('balance_sheets/'+this.balance_sheet_id+"/transactions/");
        for (let t of trans) {
          writer.update(this.transCollection.doc(id),t);
        }
        return writer.commit();
    }
}

如果我像上面那样包含AngularFirestoreDocument,则会出现此编译时错误: 错误TS2345:“ AngularFirestoreDocument <{}>”类型的参数无法分配给“ DocumentReference”类型的参数。       类型“ AngularFirestoreDocument <{}>”缺少类型“ DocumentReference”中的以下属性:id,firestore,parent,path和另外2个。

如果我将AngularFirestoreDocument转换为DocumentReference:   writer.update(<DocumentReference>this.transCollection.doc(id),t);

我收到此编译时错误: 错误TS2352:将类型'AngularFirestoreDocument <{}>'转换为类型'DocumentReference'可能是一个错误,因为这两个类型都没有足够的重叠。如果这是故意的,请先将表达式转换为“未知”。       类型“ AngularFirestoreDocument <{}>”缺少类型“ DocumentReference”中的以下属性:id,firestore,parent,path和另外2个

如果我将AngularFirestoreDocument转换为对未知的DocumentReference:     writer.update(<unknown> this.transCollection.doc(id),t); 它无法通过以下错误进行编译: 错误TS2345:“未知”类型的参数无法分配给“文档引用”类型的参数。

如果我将AngularFirestoreDocument强制转换为对任何文档的引用:     writer.update(<any> this.transCollection.doc(id),t); 它确实可以编译,但是当我尝试以这种方式进行批处理更新文档时出现运行时错误: 未捕获(承诺):FirebaseError:[code = invalid-argument]:函数WriteBatch.update()要求其第一个参数是DocumentReference,但它是:一个对象 FirebaseError:函数WriteBatch.update()要求其第一个参数是DocumentReference,但它是:一个对象

我希望代码能够编译并成功批量更新Transaction docs。

1 个答案:

答案 0 :(得分:0)

好的,我使用这篇非常有用的文章弄清楚了如何做到这一点,该文章提供了许多有关angularfire2本身没有的文档: Firestore Advanced Usage : angularfire - atomic writes

您可以通过angularfire2的firestore模块访问javascript API,并通过该API创建DocumentRef,而不是使用angularfire2的AngularFirestoreDocument类型。

工作代码如下:

export class FinancialService {

    batch_update_trans(trans) {
        let writer = this.afs.firestore.batch();
        let transDoc = null;
        for (let t of trans) {
          transDoc = this.afs.firestore.doc(
             'balance_sheets/'+this.balance_sheet_id+"/transactions/"+t.id);
          writer.update(transDoc,t);
        }
        return writer.commit();
    }
}