最近 Firebase 引入了Cloud Functions。
就我而言,此功能对于计算数据库中的元素非常有用。
Firebase 发布了一个示例代码来计算元素,但我问自己一些关于大数据的问题。
在我们的示例中,我们认为我们需要计算帖子的点赞数。
在示例代码中,在每个新的like 处,函数 count all likes 对当前帖子并更新计数。
你认为它是大数据的一个很好的解决方案吗?(例如,如果我们有 100 万个赞)
先感谢您 !
最近 Firebase 引入了Cloud Functions。
就我而言,此功能对于计算数据库中的元素非常有用。
Firebase 发布了一个示例代码来计算元素,但我问自己一些关于大数据的问题。
在我们的示例中,我们认为我们需要计算帖子的点赞数。
在示例代码中,在每个新的like 处,函数 count all likes 对当前帖子并更新计数。
你认为它是大数据的一个很好的解决方案吗?(例如,如果我们有 100 万个赞)
先感谢您 !
同意函数示例中的代码不适用于大量数据。
很长一段时间以来,我在计数器中使用了两步法:
所以案例 #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 中提交了这个。
请参阅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 许可的版权。有关更多详细信息,请参阅代码。