【问题标题】:Firebase firestore complicated queryFirebase firestore 复杂查询
【发布时间】:2019-06-04 16:54:27
【问题描述】:

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

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

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

假设用户订阅了134

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

'subscribed_to': [1,3,4]

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

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

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

    { 
       "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一下也能帮上忙,似乎有很多意见,找到最适合你的。

    【讨论】:

    • 谢谢,这是一个非常好的答案。我没有想到这种方法!
    • 很高兴为您提供帮助 :)
    • 这很有趣。我想到的是创建一个像users/user_id/subscriptions 这样的集合。
    • 基本知道你的视图长什么样子,预先计算出场景背后的对象,然后把它压缩成一个文档,而不是调用多个文档
    • 不能再同意了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 2023-01-13
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    相关资源
    最近更新 更多