【问题标题】:Update a field from all documents in Firebase更新 Firebase 中所有文档的字段
【发布时间】:2021-01-04 02:29:20
【问题描述】:

我是 Firebase 的新手,我不确定如何更新一个集合中所有文档中的相同字段。

  return db.collection('collection').get().then((snapshot) => {
    return snapshot.forEach((doc) => {

      doc.update({'field': 1});
      
    });
  })
  .catch((err) => {
    console.log('Error getting documents', err);
  });

我在 firebase 函数中运行此代码。没有错误,但什么也没有发生。我在文档中看不到有关此特定问题的任何内容。有谁知道怎么回事?

【问题讨论】:

    标签: javascript firebase google-cloud-firestore google-cloud-functions


    【解决方案1】:

    您需要将所有update() 调用的结果返回给调用者,否则它无法知道所有异步操作何时完成:

      return db.collection('collection').get().then((snapshot) => {
        return Promise.all(snapshot.documents.map((doc) => {
          return doc.ref.update({'field': 1});
        }));
      });
    

    变化:

    1. return 来自 update() 的承诺,以便它可以冒泡到 Cloud Functions 容器。
    2. 使用map 以便我们获得一系列承诺。
    3. 然后使用Promise.all,以便我们仅在所有更新完成后才完成(并因此终止 Cloud Function)。

    【讨论】:

    • 嗨弗兰克,感谢您的快速帮助!我尝试了您的更改,但 firebase-log 显示:“获取文档时出错 TypeError:snapshot.map 不是函数”。你知道出了什么问题吗?
    • 哦,对了,应该是snapshot.documents.map。我修复了答案中的代码。我强烈建议在编码时将参考文档放在手边,因为一旦习惯阅读这些错误,这种类型的错误很容易解决:firebase.google.com/docs/reference/swift/firebasefirestore/api/…
    • 不知何故它不起作用...没有错误,但没有任何反应。我尝试了一些不同的东西,这对我有用。我将其发布为答案,如果我的方法不好,请纠正我,然后其他人知道这不是最好的方法。谢谢你的时间弗兰克,我很感激。
    • 您的代码中还有另一个错误,因为在 DocumentSnapshot 上没有 update 方法。这实际上应该在调用时给出一个非常明确的错误消息。我也为这个错误再次更新了代码。 firebase.google.com/docs/reference/js/…
    【解决方案2】:

    这种方法对我有用...不知道这是否是正确的方法(正如我所说的我是初学者)

    exports.scheduledFunction2 = functions.pubsub.schedule('every 1 minutes').onRun((context) => {
    
        return db.collection("collection")
        .get()
        .then(querySnapshot => {
          if (!querySnapshot.empty) {
            for(let i =0;i<querySnapshot.size;i++){
    
              var queryDocumentSnapshotTest = querySnapshot.docs[i];
              
    
              queryDocumentSnapshotTest.ref.update({'counter':1});
    
            }
            
      
            return null;
      
          } else {
           // do nothing
           console.log("No document corresponding to the query!");
            return null;
          }
        });
      
      
       
      });
    

    【讨论】:

    • 这将可靠地工作。第一个return null; 将在异步update 调用完成之前运行,这意味着云函数可能在数据库更新提交之前中止。
    • 有没有快速的解决方案...我如何才能在退货前等待?
    • 通过在我的答案中使用代码? ¯\_(ツ)_/¯
    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 2016-02-17
    • 2021-12-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2019-07-15
    • 1970-01-01
    相关资源
    最近更新 更多