Typescript Firebase云函数进行数据库查询

Typescript Firebase云函数进行数据库查询,typescript,firebase,firebase-realtime-database,google-cloud-functions,Typescript,Firebase,Firebase Realtime Database,Google Cloud Functions,我正在尝试创建一个Firebase云函数,该函数根据节点的属性计算平均值 这是我的实时数据库的结构 -- Buildings - BuildingID1 - finalResult: 6.5 - Reviews -ReviewID1 - rate : 10 -ReviewID2 - rate : 3 - BuildingID - finalResult: 1.5 - Reviews -R

我正在尝试创建一个Firebase云函数,该函数根据节点的属性计算平均值

这是我的实时数据库的结构

-- Buildings
  - BuildingID1
    - finalResult: 6.5
    - Reviews
      -ReviewID1
         - rate : 10
      -ReviewID2 
         - rate : 3
- BuildingID
    - finalResult: 1.5
    - Reviews
      -ReviewID
         - rate : 2
      -ReviewID 
         - rate : 1
为此,每次添加/删除/更新子节点(即审查)时,我都要检查rate属性并将其与其他审查的grade属性相加,然后将结果除以节点数。 …最终结果将显示在名为finalResult的新属性中

到目前为止,这是我的函数,但我正在努力找到一种查询数据库的方法,以便从其他节点获取grade属性。你能帮帮我吗

export const schoolUpdated = functions.database.ref('/buildings/{buildingId}/reviews/{buildingId}/rate').onWrite( (change, context) => {

  const data = change.after.val();

 // ** calculate the result by querying the the reviews **/

return change.after.ref.parent.parent.parent.child('finalResult').set(result);

});

请尝试以下功能并让我知道:

export const schoolUpdated = functions.database.ref('/buildings/{buildingId}/reviews/{buildingId}/rate').onWrite( (change, context) => {
    return Promise.all([admin.database().ref(`/buildings/${context.params.buildingId}/reviews`).once('value')]).then(r => {
      const allReviews = r[0];
      let sumScore = 0;
      let count = 0;
      allReviews.forEach(item => {
        sumScore += item.child('rate').val();
        count = count + 1;
      });
      let result = (sumScore / count);
      return change.after.ref.parent.parent.parent.child('finalResult').set(result);
    });
  });

我想如果你能保持每栋建筑的运行计数和平均值,你会过得更好。添加新评论时,您可以只获取这两个数字,然后回写这些运行值:
average=(average*count+rating)/(count+1)
count=count+1
。太棒了!请单击波浪号接受答案:)