我正在尝试在“发票”集合中创建一个新文档,该文档可以自行运行,我也尝试在此新文档中同时添加“项目”子集合,这本身也很好。
但是,当我尝试同时执行这两项操作时,只有items集合出现在firestore控制台的新文档中,这甚至更奇怪,因为我可以在“view-invoice”中访问文档的详细信息应用程序的组件,不显示项目。
我尝试通过获取将要创建的新文档的引用,然后参考生成的新文档id / reference来设置这个新的子集合,这似乎有效,但是,同时尝试两者都不会使用主数据和子集合填充文档。
我还尝试将该方法添加到初始文档创建的then()
方法中,以解决导致此问题的潜在异步问题,但这产生了相同的结果,只添加了sub -collection。
组件:
save() {
let _this = this;
let invoiceSubtotal = 0;
let invoiceTax = 0;
let invoiceTotal = 0;
for (let item of this.items) {
invoiceSubtotal += item.subtotal;
invoiceTax += item.tax;
invoiceTotal += item.total;
}
this.invoice = {
id: null,
invoiceId: 999,
reference: this.newInvoiceForm.get('reference').value,
date: new Date(this.newInvoiceForm.get('date').value),
contact: this.selectedContact,
description: this.newInvoiceForm.get('reference').value,
subtotal: +invoiceSubtotal,
tax: +invoiceTax,
total: +invoiceTotal,
paid: false
}
this.db.collection('/users').doc(this.userId).collection('/invoices').add(this.invoice)
.then(function(docRef) {
_this.notifService.showNotification('New invoice created', null);
})
.catch(function(error) {
_this.notifService.showNotification('Error creating invoice: ' + error.message, null);
})
let ref = _this.db.collection('/users').doc(_this.userId).collection('/invoices').ref.doc().id;
console.log('ref: ' + ref);
for (let item of _this.items) {
_this.db.collection('/users').doc(_this.userId).collection('/invoices').doc(ref).collection('/items').add(item)
.then(function(docRef) {
console.log('document added to items collection: ', item);
})
.catch(function(error) {
console.error('Error adding document to items collection: ' + error.message);
})
}
}
答案 0 :(得分:0)
我通过使用不同的方法设置文档数据来解决这个问题。
我没有使用collection().add()
方法直接添加文档,而是使用了' ref'我必须将子集合设置为doc(ref).set(this.invoice)
的参数,以便绝对引用相同的文档引用,即item子集合将项目推到较低的位置。
let ref = _this.db.collection('/users').doc(_this.userId).collection('/invoices').ref.doc().id;
console.log('ref: ' + ref);
this.db.collection('/users').doc(this.userId).collection('/invoices').doc(ref).set(this.invoice)
.then(function(docRef) {
_this.notifService.showNotification('New invoice created', null);
})
.catch(function(error) {
_this.notifService.showNotification('Error creating invoice: ' + error.message, null);
})
for (let item of _this.items) {
_this.db.collection('/users').doc(_this.userId).collection('/invoices').doc(ref).collection('/items').add(item)
.then(function(docRef) {
console.log('document added to items collection: ', item);
})
.catch(function(error) {
console.error('Error adding document to items collection: ' + error.message);
})
}
答案 1 :(得分:0)
这是一个古老的问题,但这仅供观众参考。 使用firestore Batch将是一个更好的主意。创建一个批处理,并添加主文档,然后添加子集合文档。