如何在Firestore中组织存储用户及其关联活动数据
Firestore 订阅活动存储方案选型与查询方法
选型建议:子集合 vs 数组(字符串列表)
数组方案适用场景
如果你满足以下所有条件,可以把ThisListOfData设为对象数组类型(如果要存储子数据不要用纯字符串列表,纯字符串无法承载额外子字段):
- 单个用户的订阅活动总数不超过100个
- 没有单独查询、筛选单个活动子数据的需求
- 不需要基于活动子数据做聚合查询
- 活动子数据后续不会有大量字段扩容
优势: - 单次获取用户文档就能直接拿到全量订阅活动数据,不需要二次查询
- 增删操作可以用Firestore的
arrayUnion、arrayRemove方法实现,操作简单
劣势: - Firestore单文档最大容量为1MB,订阅量大会触发容量上限
- 无法对活动子数据做条件查询,只能全量读取后自行筛选
- 订阅量超过几百个时,单文档读写开销会明显上升
更推荐的子集合方案
你可以在每个用户文档下新建名为ThisListOfData的子集合,子集合内每个文档对应一个用户订阅的活动,文档内存储ThisSubData1、ThisSubData2等子字段。
适用所有场景,尤其满足以下情况时优先选该方案:
- 单用户订阅活动可能超过100个
- 后续需要对单个订阅活动做单独增删改、条件查询
- 活动子数据后续可能扩容增加字段
优势: - 无存储上限,支持用户订阅任意数量的活动
- 可以单独操作某个活动的子数据,不需要读写全量列表
- 支持基于活动子数据做筛选、排序、聚合等查询,扩展性极强
劣势: - 获取全量订阅活动需要多一次子集合查询,开销极低可以忽略
查询方法
数组方案查询
直接读取对应用户的文档即可,ThisListOfData字段直接返回全量订阅活动:
// Web SDK 示例代码 const userDoc = await db.collection('Users').doc('你的用户ID').get(); if (userDoc.exists) { const subscribedActivities = userDoc.data().ThisListOfData; // 直接使用subscribedActivities即可 }
子集合方案查询
查询对应用户文档下ThisListOfData子集合的全部文档:
// Web SDK 示例代码 const activitiesCol = await db.collection('Users').doc('你的用户ID').collection('ThisListOfData').get(); const subscribedActivities = activitiesCol.docs.map(doc => ({ activityId: doc.id, ...doc.data() })); // 直接使用subscribedActivities即可
内容的提问来源于stack exchange,提问作者Tritize
相关产品推荐
相关产品推荐

