firebase - 如何在 Firebase 云功能中更新文档
问题描述
在我的云功能中,当新学生添加到“学生”集合时,我想从“仪表板”集合更新我的文档。
const getActiveStudents = () => {
return db.collection('/students/').where('status', '==', true).get().then(
snapshot => {
let studentsCount = snapshot.docs.length;
db.collection('/dashboard/').where('type', '==', 'students').get().then(
result => {
if (result.docs.length === 0) {
db.collection('dashboard').add({
count: studentsCount,
type: 'students',
label: 'Active students'
});
}else {
result.docs[0].ref.update({
count: studentsCount,
type: 'students',
label: 'Active students'
});
}
return result;
}
).catch(error => {
console.log(error);
});
return snapshot;
}
).catch(error => {
console.log(error);
})
}
exports.onChangesInStudents = functions.firestore.document('/students/{studentId}').onWrite(event => {
getActiveStudents();
return;
});
当我添加一个新学生时,它不会更新文档,而是将一个新文档添加到我的“仪表板”集合中。我应该如何组织我的代码以正确更新学生的数量。
解决方案
正如@Doug 提到的,迭代整个集合太重了。相反,您可以使用query.stream()流式传输查询结果并遍历键。
要访问和更新文档中的单个字段,首先使用doc()通过其 ID 检索文档,然后在指定字段时使用update() 。
这是基于您的场景的实施示例。
包.json
{
"dependencies": {
"firebase-admin": "^6.5.1",
"firebase-functions": "^2.1.0"
}
}
index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
const studentsRef = admin.firestore().collection('students');
const dashboardRef = admin.firestore().collection('dashboard');
exports.addStudent = functions.firestore
.document('students/{studentId}')
.onCreate((snap, context) => {
var newStudent = snap.data();
console.log('New student in collection: ', newStudent);
var activeCount = 0;
studentsRef.where('status', '==', true).select().stream()
.on('data', () => {
++activeCount;
}).on('end', () => {
dashboardRef.where('type', '==', 'students').get()
.then(querySnap => {
if (querySnap.docs[0].data().count == activeCount){
console.log('No new active student: ', querySnap.docs[0].data());
} else {
console.log('New active count: ', activeCount);
console.log('Student Dashboard before update: ', querySnap.docs[0].id, '=>', querySnap.docs[0].data());
dashboardRef.doc(querySnap.docs[0].id).update({
count: activeCount
});
console.log('Active student count updated: ', querySnap.docs[0].data().count, '=>', activeCount);
};
});
});
return null
});
云
gcloud functions deploy addStudent \
--runtime nodejs8 \
--trigger-event providers/cloud.firestore/eventTypes/document.create \
--trigger-resource "projects/[PROJECT_ID]/databases/(default)/documents/students/{studentId}"
推荐阅读
- typescript - TS2339:“元素”类型上不存在属性“msMatchesSelector”
- ios - 当我更改数据源中的项目数时,UIcollection 视图崩溃
- sed - sed命令将逗号分隔的字符串分成一定的长度
- node.js - 会话实体在对话流的用户实体解析中的使用
- c# - 将空字段从数据表写入 xml 文件
- java - 如何在 Jetty 中添加重试到端口绑定
- laravel - Laravel:1060 运行迁移时列名重复
- c# - 使用委托和事件在 Unity 中创建事件管理器(消息系统)
- powershell - 如何在 PowerShell 中转义和替换“\”
- react-native - react-native 0.57.4,`_typeof3 is an instance of Object`错误