Firebase firestore复杂查询

Firebase firestore复杂查询,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我想知道这是否可能,这是否是解决我问题的好办法 我希望用户能够订阅内容。该内容与一个id关联。。例如: 'JavaScript': 1, 'C++': 2, 'Python': 3, 'Java': 4, 假设用户订阅了1、3和4 因此,他们的用户json数据将显示为: “订阅”:[1,3,4] 现在在我的firestore里,我有帖子。例如,每个帖子都会被分配一个content_id 1-4,因此当我查询该用户订阅的内容时,我将如何尽可能有效地进行查询 这确实是一个复杂但常见的情况,我建议设

我想知道这是否可能,这是否是解决我问题的好办法

我希望用户能够订阅内容。该内容与一个id关联。。例如:

'JavaScript': 1,
'C++': 2,
'Python': 3,
'Java': 4,
假设用户订阅了1、3和4

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

“订阅”:[1,3,4]


现在在我的firestore里,我有帖子。例如,每个帖子都会被分配一个content_id 1-4,因此当我查询该用户订阅的内容时,我将如何尽可能有效地进行查询

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

{ 
   "subscriptions" {
      javascript: { ... },
      python: { ... },
      java: { ... }
   },
   "users": {
      1: {
        subscribed_to: ['javascript', 'python']
      }
   }
}
非常重要的是,在你订阅的道具上使用文档名,因为这是允许你向他们查询文档的部分

最大的问题是,我如何查询这些数据?我没有加入

案例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:

创建一个view dashboard集合并预先计算幕后的dashboard,这种方法涉及云函数来侦听或更改用户更改,也可能是订阅,并将每个单独的文档复制到另一个集合中,比如说每个用户的订阅。这是一个更复杂的方法,我需要更多的时间来解释,但是如果你有一个成本很重要的大型应用程序,如果用户要订阅很多东西,那么你可能需要调查一下


资料来源:我自己的经验。。。一点谷歌也能帮上忙,似乎有很多关于它的意见,找到最适合你的。

谢谢,这是一个非常好的答案。我没有想到这种方法!很乐意帮忙:这很有趣。我想到的是创建一个像users/user\u id/subscriptions这样的集合。基本上知道你的视图是什么样子,预先计算场景背后的对象,并将其压缩成一个单独的文档,而不是调用多个文档