Firestore 的 WriteBatch.update() 不会采用 angularfirestore2 的 AngularFirestoreDocument
Firestore's WriteBatch.update() won't take angularfirestore2's AngularFirestoreDocument
我正在尝试使用 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' 的转换可能是一个错误,因为两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为 'unknown'。
类型 'AngularFirestoreDocument<{}>' 缺少类型 'DocumentReference' 的以下属性:id、firestore、parent、path 和另外 2 个
如果我将 AngularFirestoreDocument 转换为未知的 DocumentReference:
writer.update(<unknown> this.transCollection.doc(id),t);
它无法编译并出现此错误:
错误 TS2345:'unknown' 类型的参数不可分配给 'DocumentReference'.
类型的参数
如果我将 AngularFirestoreDocument 转换为 DocumentReference 到任何:
writer.update(<any> this.transCollection.doc(id),t);
它确实可以编译,但是当我尝试以这种方式批量更新文档时出现 运行time 错误:
未捕获(承诺):FirebaseError: [code=invalid-argument]: Function WriteBatch.update() requires its first argument to be a DocumentReference, but it was: an object
FirebaseError:函数 WriteBatch.update() 要求其第一个参数是 DocumentReference,但它是:一个对象
我期待代码能够编译并成功批量更新交易文档。
好的,我想出了如何使用这篇非常有用的文章来做到这一点,该文章提供了许多 angularfire2 本身没有的文档:
Firestore Advanced Usage : angularfire - atomic writes
您可以通过 angularfire2 的 firestore 模块访问 javascript API 并通过该模块创建一个 DocumentRef API,而不是使用 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();
}
}
我正在尝试使用 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' 的转换可能是一个错误,因为两种类型都没有充分重叠。如果这是故意的,请先将表达式转换为 'unknown'。 类型 'AngularFirestoreDocument<{}>' 缺少类型 'DocumentReference' 的以下属性:id、firestore、parent、path 和另外 2 个
如果我将 AngularFirestoreDocument 转换为未知的 DocumentReference:
writer.update(<unknown> this.transCollection.doc(id),t);
它无法编译并出现此错误:
错误 TS2345:'unknown' 类型的参数不可分配给 'DocumentReference'.
如果我将 AngularFirestoreDocument 转换为 DocumentReference 到任何:
writer.update(<any> this.transCollection.doc(id),t);
它确实可以编译,但是当我尝试以这种方式批量更新文档时出现 运行time 错误:
未捕获(承诺):FirebaseError: [code=invalid-argument]: Function WriteBatch.update() requires its first argument to be a DocumentReference, but it was: an object
FirebaseError:函数 WriteBatch.update() 要求其第一个参数是 DocumentReference,但它是:一个对象
我期待代码能够编译并成功批量更新交易文档。
好的,我想出了如何使用这篇非常有用的文章来做到这一点,该文章提供了许多 angularfire2 本身没有的文档: Firestore Advanced Usage : angularfire - atomic writes
您可以通过 angularfire2 的 firestore 模块访问 javascript API 并通过该模块创建一个 DocumentRef API,而不是使用 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();
}
}