【问题标题】:Firebase cloud function make a database queryFirebase 云功能进行数据库查询
【发布时间】:2018-12-03 10:54:47
【问题描述】:

我正在尝试创建一个 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 属性并将其与其他评论的等级属性相加,然后将结果除以节点的数量。 ...最终结果将显示在名为 finalResult 的新属性中。

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

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);

});

【问题讨论】:

  • 我认为,如果您同时保留每栋建筑物的运行计数和平均值,您的情况会更好。添加新评论时,您可以只获取这两个数字,然后写回这些运行值:average=(average*count+rating)/(count+1)count=count+1

标签: typescript firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

请尝试以下功能并告诉我:

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);
    });
  });

【讨论】:

  • 太棒了!请点击波浪号接受答案:)
猜你喜欢
  • 2019-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2020-05-15
  • 1970-01-01
相关资源
最近更新 更多