编程Firebase云函数时遇到的问题,如果满足某些条件,该函数将删除集合中的文档

m1m5dgzv  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(159)

我有一个ProductDatabase集合,它存储了我在应用程序上显示的所有产品。集合中的每个文档都有一个名为“SBD”的时间戳字段,它代表每个项目的销售日期。我创建并上传了一个云函数,它每2小时检查数据库中的每个项目,以检查每个项目的SBD字段没有通过。这是函数:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.delete = functions
    .region("europe-west2")
    .pubsub.schedule("every 2 hours").onRun((context) => {
      const productsRef = admin.firestore().collection("TestDatabase");

      const query = productsRef.where("SBD", "<", Date.now());

      return query.get()
          .then((querySnapshot) => {
            const batch = admin.firestore().batch();

            querySnapshot.forEach((doc) => {
              batch.delete(doc.ref);
            });

            return batch.commit();
          });
    });

这个程序上传出现在firebase cloud functions控制台,并说它每2小时被调用一次,但是没有产品从TestDatabase中删除,即使它们都应该被删除。index.js文件存储在谷歌云控制台的一个桶中,该控制台拥有所有必要的权限。数据库和云函数也在同一个区域。

31moq8wy

31moq8wy1#

问题是你在SBD字段上做了一个无效的比较。如果SBD是一个Timestamp对象,那么你的查询必须在比较中使用Timestamp对象,而不是Date对象。
这是一个无效的比较,将始终返回0条记录,因为您不能比较两个不同的对象类型:

const query = productsRef.where("SBD", "<", Date.now());

这是由getting UNIX time执行的有效比较,并将其转换为Timestamp

const seconds = Math.floor(Date.now() / 1000)
const nanoseconds = 0
const now = new Timestamp(seconds, nanoseconds)
const query = productsRef.where("SBD", "<", now);

你可以在How to compare firebase timestamps?阅读更多。

相关问题