上下文:
我正在构建一个以 Firebase 作为后端的生日提醒移动应用程序。我正在考虑使用预定的云功能向在特定日期过生日的用户发送通知。
我正在考虑将 Firestore 中的生日数据保存在 365 单独的文档中。
例如:
Jan1 - [user1, user2, user3...]
Jan2 - [user4, user5...]
...
Dec31 - [userX, userY, userZ...]
我看到的优势是云函数只需要读取特定文档(文档名称可以从当前日期识别)。
这是一种可扩展的方法吗?
在 Firebase/GCP 中有没有更好的选择来实现这个功能?
对我来说,我认为您的方法从长远来看可能无法扩展,并且随着数据的增长会产生性能问题。
更具可扩展性的方法是将所有生日存储在一个集合中,并使用云函数查询集合中与当前日期匹配的生日。
您可以在文档中添加一个字段来存储生日,然后使用查询根据当前日期过滤文档。这将消除每天将数据存储在单独文档中的需要。
这是一个示例,说明如何查询 Firestore 集合以获取当天生日的用户:
def send_birthday_notifications(request):
today = datetime.datetime.now().strftime('%m-%d')
users_ref = db.collection('users')
query = users_ref.where('birthdate', '==', today).stream()
for user in query:
# send notification to user
我正在考虑使用预定的云功能来发送通知。
这是个好主意。
我正在考虑将Firestore中的生日数据保存在365个单独的文档中。
这也是一个很好的主意,但只有当文档保持在最大限制以下时它才会起作用。根据有关usage and limits的官方文档:
文档的最大大小:1 MiB(1,048,576 字节)
如您所见,单个文档中的数据总量不得超过 1 MiB。当我们谈论存储文本时,您可以存储很多东西。但是,不要将 UID 存储为单独的字段,最好创建一个数组类型的字段,您可以在其中添加所有 UID。所以你可以每天 schedule Cloud Function,读取数组的内容并发送通知。
如果你觉得你能达到1MiB,那么我建议你创建两个文件,一个是从
a
到m
开头的UID,另一个是从n
到z
开头的UID。如果这也不起作用,请创建三个文档,依此类推。