Angular Firestore - 同时添加带有子集合的新文档

时间:2018-04-12 09:18:56

标签: angular typescript firebase asynchronous google-cloud-firestore

我正在尝试在“发票”集合中创建一个新文档,该文档可以自行运行,我也尝试在此新文档中同时添加“项目”子集合,这本身也很好。

但是,当我尝试同时执行这两项操作时,只有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);
            })

    }

}

2 个答案:

答案 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将是一个更好的主意。创建一个批处理,并添加主文档,然后添加子集合文档。