Javascript 如何使用angular一次从firebase读取和更新多个文档

Javascript 如何使用angular一次从firebase读取和更新多个文档,javascript,angular,firebase,ionic-framework,google-cloud-firestore,Javascript,Angular,Firebase,Ionic Framework,Google Cloud Firestore,我正在尝试开发一个函数,从firestore中读取我有id的文档列表,并从这些文档中更新字段“可用性”。我用的是带角度的离子骨架 为了解决这个问题,我需要一次完成所有工作,因此我正在使用更新可用性。问题是,我首先必须检查是否有足够的票(可用性>0) 所以我想出了这个办法: buyTicket(event:event, ticketid:product[]){ return this.db.firestore.runTransaction(async function(transaction) {

我正在尝试开发一个函数,从firestore中读取我有id的文档列表,并从这些文档中更新字段“可用性”。我用的是带角度的离子骨架

为了解决这个问题,我需要一次完成所有工作,因此我正在使用更新可用性。问题是,我首先必须检查是否有足够的票(可用性>0)

所以我想出了这个办法:

buyTicket(event:event, ticketid:product[]){
return this.db.firestore.runTransaction(async function(transaction) {
      let available = true;
      return Promise.all(ticketid.map( p => {
        let reference =  this.db.firestore.collection('events').doc(event.id)
        .collection('tickets')
        .doc(p.id);
        return  transaction.get(reference).then(doc => {
                    if (!doc.exists){
                      throw "Document does not exist"
                    }
                    var data = doc.data() as product;
                    if (data.availability < 1){
                      available = false;
                    }
                    //I DON'T KNOW WHERE TO WRITE TRANSACTION.UPDATE
                  }).then(() =>{
                    console.log(available)
                  })
      }))
}).then(function() {
  console.log("Changed")
}).catch(function(error) {
    console.error("Transaction failed: ", error);
});
}
buyTicket(事件:事件,ticketid:product[]){
返回此.db.firestore.runTransaction(异步函数(事务){
让可用=真实;
返回Promise.all(ticketid.map)(p=>{
let reference=this.db.firestore.collection('events').doc(event.id)
.收款(“票据”)
.doc(p.id);
返回事务。获取(参考)。然后(文档=>{
如果(!doc.存在){
抛出“文档不存在”
}
var data=doc.data()作为产品;
如果(数据可用性<1){
可用=错误;
}
//我不知道在哪里写TRANSACTION.UPDATE
}).然后(()=>{
console.log(可用)
})
}))
}).然后(函数(){
console.log(“已更改”)
}).catch(函数(错误){
控制台错误(“事务失败:”,错误);
});
}
我需要等到Promise.all完成后才能执行transaction.update。我想知道读取所有字段并更新它们的最佳方式是什么,可能是使用查询并使用批处理更新它们,但是我认为我可能会引入一些与此解决方案不一致的地方,因为我无法确保批处理完成后是否有可用的票据。

不同的文档是否相互依赖?或者您实际上希望在每个文档上执行一个事务(检查
可用性<1
并更新字段
可用性
),独立于其他文档。换句话说,您是否需要在一个事务中包含所有文档?另外,我不知道您的确切要求,但您可以在后端使用云功能,每次您修改一个文档时,它都会检查
可用性<1
并更新字段
可用性