firebase - Firestore 事务更新多个文档
问题描述
我想更新一个集合中的文档。
my_collection
document_1
field_1
field_2
document_2
field_1
field_2
我的代码:
exports.aggregateUsers =
functions.firestore.document('users/{userId}').onWrite(function(change,
context) {
const document = change.after.exists ? change.after.data() : null;
const oldDocument = change.before.data() || null;
return firestore.runTransaction(function(transaction) {
var oldInstanceRef;
var instanceRef;
var oldInstanceDoc;
var instanceDoc;
if (document != null) {
instanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(document.instance);
instanceDoc = transaction.get(instanceRef);
var newNumberOfUsers = (instanceDoc.data().number_of_users || 0) + 1;
transaction.set(instanceRef, { number_of_users: newNumberOfUsers });
}
if (oldDocument != null) {
oldInstanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(oldDocument.instance);
oldInstanceDoc = transaction.get(oldInstanceRef);
var newPrevNumberOfUsers = (oldInstanceDoc.data().number_of_users || 0) + 1;
transaction.set(instanceRef, { number_of_users: newPrevNumberOfUsers });
}
}).catch(function(error) {
console.log("invalid-argument", error.code, error.message);
});
});
错误:
instanceDoc.data is not a function
由于应用程序流量低,我正在使用云功能中的交易来汇总用户数量,而不是使用分布式计数器。我的问题是如何更新每个文档中的字段值?谢谢
解决方案
我猜你忘记了异步/等待。
尝试这个:
async
transaction
参数前await
前transaction.get(<some_ref_here>)
return firestore.runTransaction(async transaction => {
var oldInstanceRef;
var instanceRef;
var oldInstanceDoc;
var instanceDoc;
if (document != null) {
instanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(document.instance);
instanceDoc = await transaction.get(instanceRef);
var newNumberOfUsers = (instanceDoc.data().number_of_users || 0) + 1;
transaction.set(instanceRef, { number_of_users: newNumberOfUsers });
}
if (oldDocument != null) {
oldInstanceRef = firestore.collection("counters").doc("instance_counter").collection("instances").doc(oldDocument.instance);
oldInstanceDoc = await transaction.get(oldInstanceRef);
var newPrevNumberOfUsers = (oldInstanceDoc.data().number_of_users || 0) + 1;
transaction.set(instanceRef, { number_of_users: newPrevNumberOfUsers });
}
}).catch(function(error) {
console.log("invalid-argument", error.code, error.message);
});
推荐阅读
- excel - 如何将每个单独的 excel 行导出到自己的单独 csv 文件?
- c# - 动态生成列时,如何修复 DataGrid 中缺少的行显示?
- php - FosUserBundle 模拟外部
- css - 为什么 CSS background-image url 不显示我的图像,尽管链接和路径是正确的?
- windows - 是否可以使用 AWS 运行普通的 Windows 10 机器?
- php - 使用 UPDATE 不会将图像加载到我的数据库
- php - Laravel 5.4 Query Builder 数组到字符串的转换
- php - PHP:从 WSDL 访问另一个数组中的对象内的数组
- php - How to fix Yii2 Contact Widget Problem on View Pages
- docker - 如何在没有互联网连接的情况下启动 Docker?