我有一个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云函数控制台中,并表示它每2小时被调用一次,但是没有任何产品从测试数据库中删除,即使它们都应该被删除.Js文件存储在Google云控制台中的一个存储桶中,该控制台具有所有必要的权限.数据库和云函数也在同一区域.

推荐答案

问题是您正在对SBD字段进行无效的比较.如果SBDTimestamp对象,则您的查询必须在比较中使用Timestamp对象.

这是一个无效的比较,将始终返回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?岁时阅读更多.

Javascript相关问答推荐

如何从defineExpose访问数据和方法

带对角线分隔符的图像滑动器

主要内部的ExtJS多个子应用程序

获取加载失败:获取[.]添加时try 将文档添加到Firerestore,Nuxt 3

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

colored颜色 检测JS,平均图像 colored颜色 检测JS

如何将Cookie从服务器发送到用户浏览器

如何使onPaste事件与可拖动的HTML元素一起工作?

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

对网格项目进行垂直排序不起作用

如何在Node.js中排除导出的JS文件

如何使用TypeScrip设置唯一属性?

当标题被点击时,如何使内容出现在另一个div上?

与svg相反;S getPointAtLength(D)-我想要getLengthAtPoint(x,y)

在Vercel中部署Next.js项目时获取`ReferenceError:未定义文档`

不同表的条件API端点Reaction-redux

无法检索与Puppeteer的蒸汽游戏的Bundle 包价格

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

我无法在Api Reaction本机上发出GET请求

更新文本区域行号