Javascript Firebase Cloudstore:如何在集合中“全部更新”/“删除部分”文档?
对于上下文:我有一个cron-job.org,它在我的firebase项目中启动https函数 在这个函数中,我必须遍历集合中的所有文档并更新计数器。每个文档可能有不同的计数器值。如果计数器达到限制,我将更新与第一个集合无关的另一个集合,并删除达到限制的文档条目。如果计数器没有超出限制,我只需使用更新的计数器值更新文档条目 我尝试从文档中改编示例,尝试使用事务、批处理,但我不确定如何继续。根据交易记录的描述,这是一种方法,但示例仅显示如何编辑单个文档 这就是我尝试调整实时数据库示例的内容:Javascript Firebase Cloudstore:如何在集合中“全部更新”/“删除部分”文档?,javascript,firebase,transactions,google-cloud-firestore,Javascript,Firebase,Transactions,Google Cloud Firestore,对于上下文:我有一个cron-job.org,它在我的firebase项目中启动https函数 在这个函数中,我必须遍历集合中的所有文档并更新计数器。每个文档可能有不同的计数器值。如果计数器达到限制,我将更新与第一个集合无关的另一个集合,并删除达到限制的文档条目。如果计数器没有超出限制,我只需使用更新的计数器值更新文档条目 我尝试从文档中改编示例,尝试使用事务、批处理,但我不确定如何继续。根据交易记录的描述,这是一种方法,但示例仅显示如何编辑单个文档 这就是我尝试调整实时数据库示例的内容: fu
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,将其删除。
有关更多信息,我建议您扫描。进度!我能够更新计数器集合中的每个文档。现在,您的建议是根据我刚刚更新的元素的完成情况(即达到阈值)在另一个集合中创建一个元素。但是,我还想更新其他集合,而不仅仅是创建一个新项。当计数器达到阈值时,我想将其添加到现有库存中。是否可以使用嵌套事务?这是一个好的做法吗?我不确定您是否可以嵌套事务,但无论如何都不需要:您对股票的更新是读取现有计数器并更新/删除它的同一事务。