Firebase Firestore复杂查询

时间:2019-06-04 16:54:27

标签: firebase google-cloud-firestore

我想知道这是否可能,并且是否可以很好地解决我的问题。

我希望用户能够subscribe观看内容。内容与id ..相关,例如:

'JavaScript': 1,
'C++': 2,
'Python': 3,
'Java': 4,

假设用户订阅了134

因此他们的用户json数据将显示为:

'subscribed_to': [1,3,4]

现在在我的消防站中,我有帖子。每个帖子都会分配一个content_id(例如1-4),因此当我查询该用户订阅的内容时,我将如何尽可能有效地做到这一点?

1 个答案:

答案 0 :(得分:3)

这确实是一个复杂但常见的情况,我建议设置类似以下的数据结构:

{ 
   "subscriptions" {
      javascript: { ... },
      python: { ... },
      java: { ... }
   },
   "users": {
      1: {
        subscribed_to: ['javascript', 'python']
      }
   }
}

subscribed_to道具上使用doc名称非常重要,因为这是允许您查询它们(文档)的部分。

最大的问题,如何查询此数据?我没有加入!

案例1:

假设您在应用负载时拥有用户数据...

const fetchDocs = async (collection, docs) => {
    const fetchs = docs.map(id => collection.doc(id).get())
    const responses = await Promise.all(fetchs)
    return responses.map(r => r.data())
}

const userSubscriptions = ['javascript', 'python']
const mySubscriptions = await fetchDocs(`subscriptions`, userSubscriptions)

在后台,SDK将所有查询分组,并尽最大努力将它们一起交付。这样效果很好,我保证99%的用户每次登录时仍然需要为每个查询单独付费。

案例2:

创建一个视图仪表板集合并在幕后预先计算dashboard,此方法涉及云功能以侦听或更改用户更改(可能还包括订阅),并将每个文档复制到另一个集合中,例如subscriptions_per_users。这是一种更复杂的方法,我将需要更多时间来解释,但是如果您的大型应用程序中成本很重要,并且用户打算订阅很多东西,那么您可能需要调查一下。

资料来源:我自己的经验...一些Google员工也可以提供帮助,对此似乎有很多意见,找到最适合您的方法。