2

最近 Firebase 引入了Cloud Functions

就我而言,此功能对于计算数据库中的元素非常有用。

Firebase 发布了一个示例代码来计算元素,但我问自己一些关于大数据的问题。

在我们的示例中,我们认为我们需要计算帖子的点赞数。

在示例代码中,在每个新的like 处,函数 count all likes 对当前帖子并更新计数。

你认为它是大数据的一个很好的解决方案吗?(例如,如果我们有 100 万个赞)

先感谢您 !

4

2 回答 2

5

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

很长一段时间以来,我在计数器中使用了两步法:

  1. 添加/删除孩子时,增加/减少计数器
  2. 当计数器被删除时,重新计算所有的孩子(就像现在一样)

所以案例 #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 中提交了这个。

于 2017-03-13T03:45:47.883 回答
1

请参阅functions-samples中的示例。

给定一个类似这样的数据结构:

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

这个函数可以解决问题:

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);

// Keeps track of the length of the 'likes' child list in a separate attribute.
exports.countlikes = functions.database.ref('/posts/{postid}/likes').onWrite(event => {
  return event.data.ref.parent.child('likes_count').set(event.data.numChildren());
});

请注意,此代码是 Google 和 apache 许可的版权。有关更多详细信息,请参阅代码

于 2017-03-10T22:59:56.710 回答