我有一个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中删除,即使它们都应该被删除。js文件存储在具有所有必要权限的google云控制台的桶中。数据库和云功能也在同一区域。
问题是您正在对SBD
字段进行无效的比较。如果SBD
是Timestamp
对象,那么您的查询必须在比较中使用Timestamp
对象。
这是一个无效的比较,将始终返回0条记录,因为您不能比较两个不同的对象类型:
const query = productsRef.where("SBD", "<", Date.now());
这是通过获取UNIX时间并将其转换为Timestamp
来执行的有效比较:
const seconds = Math.floor(Date.now() / 1000)
const nanoseconds = 0
const now = new Timestamp(seconds, nanoseconds)
const query = productsRef.where("SBD", "<", now);
您可以在如何比较firebase时间戳?阅读更多内容。