firebase 如何创建“喜欢计数”云Firestore聚合函数?

9nvpjoqh  于 2023-03-09  发布在  其他
关注(0)|答案(2)|浏览(127)

我是firebase的新手,我想创建一个聚合函数来计算喜欢的次数。
我有三个根集合:订阅源、赞和用户。

源具有以下字段:

description: <description of feed>
likeCount:<Total count of like>
title: <feed title>
userId: <userId of feed>

喜欢有以下字段:

feedId: <id of the feed where a user gives like>
likeBy: <id of the user who likes the feed>
likeTo: <id of the user how created a feed>

用户具有以下字段:

username: <User name>
email: <User email>
当一个用户喜欢一个饲料然后新的条目添加到喜欢的集合。
当用户在提要上给出like时,我试图创建一个聚合函数到increase likeCount in feed collection
我正在检查解决方案。我已经找到了如下嵌套结构的解决方案

因此,我的问题是,是否可以使用我的数据结构(三个根集合:订阅源、喜欢和用户。)?如果是,那么我如何实现它?
或者我需要改变我的数据结构吗?

68bkxrlz

68bkxrlz1#

我已经在我的系统中实现了类似的功能,我使用了Firebase Cloud Functions
你可以这样做:
每当get被添加到数据库的特定位置时,将'likesCounter'递增1:

exports.countLikes = functions.firestore
.document('likes').onWrite((change, context) => {
 const data = change.after.val();
 const count = Object.keys(data).length;
 return change.after.document.collection('likesCount').set(count - 1);
});

^^您可以将这些代码放在firebase函数项目文件夹的index.js文件中。
你需要修改上面的代码来适应你的数据库的数据结构,如果你不熟悉的话,请按照steps来开始你的firebase项目的云函数。

    • 2023年更新**

正如Runaud所说,使用admin.firestore.FieldValue.increment()效率更高,成本更低。

exports.countLikes = firebase.firestore.document('likes').onWrite((change, context) => {
    return admin
         .firestore()
         .collection("users")
         .doc(context.userID)
         .update({
            likesCount: admin.firestore.FieldValue.increment(1),
          });
}
gj3fmq9x

gj3fmq9x2#

我已经通过onCreate()方法达到了要求
代码如下:

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();
const db = admin.firestore();

exports.getLikeCount = functions.firestore
    .document('likes/{likeId}')
    .onCreate((snap, context) => {
        // Get an object representing the document (get created like data)
        const likeData = snap.data();

        // Get feed_id from created like data
        const feedId = likeData['feed_id'];

        // Create feed ref from feed_id which get from created like data
        const feedRef = db.collection('feeds').doc(feedId);

        return feedRef
            .get()
            .then(doc => {
                // Get current likesCount for feed
                const likesCount = doc.data().likesCount;

                // Increase likesCount with +1 for get feed
                return feedRef.update({likesCount: likesCount + 1});
            })

    });

相关问题