Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Firebase Cloudstore:如何在集合中“全部更新”/“删除部分”文档?_Javascript_Firebase_Transactions_Google Cloud Firestore - Fatal编程技术网

Javascript Firebase Cloudstore:如何在集合中“全部更新”/“删除部分”文档?

Javascript Firebase Cloudstore:如何在集合中“全部更新”/“删除部分”文档?,javascript,firebase,transactions,google-cloud-firestore,Javascript,Firebase,Transactions,Google Cloud Firestore,对于上下文:我有一个cron-job.org,它在我的firebase项目中启动https函数 在这个函数中,我必须遍历集合中的所有文档并更新计数器。每个文档可能有不同的计数器值。如果计数器达到限制,我将更新与第一个集合无关的另一个集合,并删除达到限制的文档条目。如果计数器没有超出限制,我只需使用更新的计数器值更新文档条目 我尝试从文档中改编示例,尝试使用事务、批处理,但我不确定如何继续。根据交易记录的描述,这是一种方法,但示例仅显示如何编辑单个文档 这就是我尝试调整实时数据库示例的内容: fu

对于上下文:我有一个cron-job.org,它在我的firebase项目中启动https函数

在这个函数中,我必须遍历集合中的所有文档并更新计数器。每个文档可能有不同的计数器值。如果计数器达到限制,我将更新与第一个集合无关的另一个集合,并删除达到限制的文档条目。如果计数器没有超出限制,我只需使用更新的计数器值更新文档条目

我尝试从文档中改编示例,尝试使用事务、批处理,但我不确定如何继续。根据交易记录的描述,这是一种方法,但示例仅显示如何编辑单个文档

这就是我尝试调整实时数据库示例的内容:

function updateCounter() {
    var ref = db.collection('my_collection_of_counters');
    return ref.get().then(snapshot => {
        const updates = {};
        snapshot.forEach(child => {
            var docData = child.data();
            var newCounter = docData.counter+1;
            if (newCounter == 10) {
                // TO-DO: add to stock
                updates[child.key] = null;
            } else {
                docData.counter = newCounter;
                updates[child.key] = docData;   
            }
        });
        // execute all updates in one go and return the result to end the function
        return ref.update(updates);
    });
}
它不起作用,集合没有更新方法。更新集合中每个文档的最佳方法是什么?一个接一个?交易有没有一个例子

PS:updateCounter是https触发器调用的函数。Cron+触发器工作正常

编辑 当一个项目达到阈值时,我想更新另一个集合,独立于计数器集合。嵌套事务是一个好的解决方案吗

修改代码:

function updateCounter() {
    var ref = db.collection('my_collection_of_counters');
    var transaction = db.runTransaction(t => {
        return t.get(ref)
                .then(snapshot => {
                    let docs = snapshot.docs;
                    for (let doc of docs) {
                        var item = doc.data();
                        var newCounter = item.counter + 1;
                        if (newCounter == 10) {
                            console.log("Update my_stock");
                            // ADD item.quantity to stock collection
                        }else{
                            t.update(doc.ref, {counter: newCounter});
                        }
                    }
                });
    })
    .then(result => {
        console.log('Transaction success');
    })
    .catch(err => {
        console.log('Transaction failure:', err);
    });
}

正如您已经指出的,您希望在事务中执行此操作,以确保可以在单个操作中更新当前计数器值。一旦计数器达到阈值,您还可以在同一事务中创建新文档并删除现有文档。我看不出在单个事务中对所有文档执行此操作有任何好处,因为每个文档上的操作似乎与其他文档无关

在Firestore事务中,您可以。在你的情况下,你应该:

使用transaction.Get获取当前文档。 从文档中获取计数器。 递增计数器。 如果新值低于阈值: 调用transaction.update将新计数器值写入数据库 如果新值高于阈值,则: 在新集合上调用transaction.create在那里创建文档。 对现有文档调用transaction.delete,将其删除。
有关更多信息,我建议您扫描。

进度!我能够更新计数器集合中的每个文档。现在,您的建议是根据我刚刚更新的元素的完成情况(即达到阈值)在另一个集合中创建一个元素。但是,我还想更新其他集合,而不仅仅是创建一个新项。当计数器达到阈值时,我想将其添加到现有库存中。是否可以使用嵌套事务?这是一个好的做法吗?我不确定您是否可以嵌套事务,但无论如何都不需要:您对股票的更新是读取现有计数器并更新/删除它的同一事务。