通过Cloud Function中的时间戳从Cloud Firestore查询

时间:2019-04-23 12:36:17

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

我写了一个脚本,该脚本在时间戳之前从 Cloud Firestore 中删除了事件。由 Cloud Function 中的链接运行的脚本。

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
var db;
var count = 0;

exports.removeOldEvents = functions.https.onRequest(async(req, res) => {
     db = admin.firestore();
     db.collection("Events")
     .where("timeStamp", "<", new Date())
     .get().then(function(querySnapshot) {
          count = querySnapshot.size;
          querySnapshot.forEach(function(doc) {
               db.collection("Events").doc(doc.id).delete();
               if (--count == 0) {
                    console.log("Successful ");
                    res.send("Successful ");
                    res.end();
               }
          });
     }).catch(function(error) {
          console.log("Error ", error);
          res.send("Error ", error);
     });

 });

我需要一起写的东西:

new Date()

为了通过timeStamp删除旧事件?

谢谢!

1 个答案:

答案 0 :(得分:1)

您正在并行调用多个异步任务(即通过delete()方法),并且只有在所有这些任务完成后才应发回响应。

由于delete()方法返回了Promise,因此您需要使用Promise.all(),如下所示:

....
exports.removeOldEvents = functions.https.onRequest((req, res) => {
  db = admin.firestore();
  db.collection('Events')
    .where('timeStamp', '<', new Date())
    .get()
    .then(querySnapshot => {
      var promises = [];
      querySnapshot.forEach(doc => {
        promises.push(
          db
            .collection('Events')
            .doc(doc.id)
            .delete()
        );
      });
      return Promise.all(promises);
    })
    .then(() => {
      console.log('Successful');
      res.send('Successful');
    })
    .catch(error => {
      console.log('Error ', error);
      res.status(500).send('Error ', error);
    });
});

请注意,当您调用此HTTPS Cloud Function时,new Date().getTime()的值将为现在。因此,我假设您有一些将来带有timeStamp值的文档,否则您很可能会删除整个集合!


还请注意,如果您确定查询返回的文档少于500个,则可以使用batched write