Firebase功能,计算大数据的元素

时间:2017-03-10 21:17:46

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

最近Firebase引入了Cloud Functions

在我的情况下,此功能对计算数据库中的元素非常有用。

Firebase发布了一个sample code to count elements,但我问自己一些关于大数据的问题。

在我们的示例中,我们认为我们需要对帖子进行计算。

在示例代码中,每个新的类似,函数计数都喜欢当前帖子并更新计数。

您认为它对大数据来说是一个很好的解决方案吗? (例如,如果我们有1M喜欢的话)

提前谢谢!

2 个答案:

答案 0 :(得分:4)

同意函数示例中的代码不适用于大型数据集。

很长一段时间以来,我在我的柜台上采用了两步法:

  1. 添加/删除子项时,增加/减少计数器
  2. 当计数器被删除时,重新计算所有孩子(就像现在一样)
  3. 所以情况#2的内存绑定与当前代码相同。但是案例#1触发了儿童写作,因此内存消耗更少。

    代码:

    // Keeps track of the length of the 'likes' child list in a separate property.
    exports.countlikechange = functions.database.ref("/posts/{postid}/likes/{likeid}").onWrite((event) => {
      var collectionRef = event.data.ref.parent;
      var countRef = collectionRef.parent.child('likes_count');
    
      return countRef.transaction(function(current) {
        if (event.data.exists() && !event.data.previous.exists()) {
          return (current || 0) + 1;
        }
        else if (!event.data.exists() && event.data.previous.exists()) {
          return (current || 0) - 1;
        }
      });
    });
    
    // If the number of likes gets deleted, recount the number of likes
    exports.recountlikes = functions.database.ref("/posts/{postid}/likes_count").onWrite((event) => {
      if (!event.data.exists()) {
        var counterRef = event.data.ref;
        var collectionRef = counterRef.parent.child('likes');
        return collectionRef.once('value', function(messagesData) {
          return counterRef.set(messagesData.numChildren());
        });
      }
    });
    

    我还在回购邮件的PR中提交了这个。

答案 1 :(得分:1)

请参阅functions-samples中的示例。

给出类似于此的数据结构:

SELECT     CASE WHEN tableA.user_type = 1 THEN tableB.user_type
                WHEN tableA.user_type = 2 THEN tableC.user_type
           END as user_type
FROM       tableA
INNER JOIN tableB 
ON         tableA.id = tableB.id
INNER JOIN tableC
ON         tableA.id = tableC.id

这个功能可以解决问题:

/functions-project-12345
    /posts
        /key-123456
            likes_count: 32
            /likes 
                user123456: true
                user456789: true
                user786245: true
                ...

请注意,此代码的版权归Google所有,并获得了apache许可。 See the code了解更多详情。