首页 > 解决方案 > 云函数 cron 作业:如何管理嵌套集合的数据

问题描述

我想使用云函数 cron 作业触发对嵌套集合数据的计划任务。

我想要实现的是,如果“limit”字段中的时间戳值晚于当前时间,则“status”字段将在嵌套集合中添加值“expired”。

父集合名称为“OrdersUser”,子集合名称为“Orders”。我想管理“订单”集合中的文档。 在此处输入图像描述 在此处输入图像描述

计划任务每​​隔一分钟运行一次。

部署后,我在 firebase 控制台中遇到错误。

id 未定义。

我想我可以在云函数中使用通配符,所以我使用 {id} 来引用嵌套文档。但我做不到。

我想查询“订单”集合中的所有数据。我该如何解决这个问题?

const functions = require('firebase-functions')
const admin = require('firebase-admin')
admin.initializeApp()
const db = admin.firestore()
const ref = functions.firestore

exports.statusOrdersUser = functions.runWith( { memory: '2GB' }).pubsub.schedule('* * * * *').onRun((context) => {

    // Consistent timestamp
    const now = admin.firestore.Timestamp.now();
    
    // Query all documents ready to perform
    //id is not defined.
    const queryOrdersUser = db.collection('OrdersUser').doc({id}).collection('Orders').where('limit', '<=', now)
    

    return queryOrdersUser.get()
            .then(querySnapshot => {

                if (querySnapshot.empty) {
                    return null;
                } else {
                    const promises = []

                    querySnapshot.forEach(doc => {
                        promises.push(doc.ref.update({ status: 'expired' }));
                    });

                    return Promise.all(promises);
                }
            });
})

标签: javascriptfirebasegoogle-cloud-firestoregoogle-cloud-functions

解决方案


Firestore 不支持文档 ID 的通配符操作。如果要查询子集合,则需要提供嵌套的文档的具体 ID。目前尚不清楚您的函数应该如何确切地知道要查询哪个子集合,因为它不接收任何参数或具有任何上下文。

如果要查询所有名为“Order”的子集合,无论它们嵌套在数据库中的任何位置,都可以使用集合组查询


推荐阅读