在Google Cloud Firestore中执行JOIN查询

时间:2019-06-19 06:37:28

标签: sql node.js firebase google-cloud-firestore

{  
   "users":{  
      "userid_1":{  
         "following":{  
            "userid_2":{  
               "name":"user2"
            },
            "userid_3":{  
               "name":"user3"
            }
         }
      },
      "posts":{  
         "postid1":{  
            "createdTime":"111",
            "postedBy":"userid_2"
         },
         "postid2":{  
            "createdTime":"112",
            "postedBy":"userid_3"
         },
         "postid3":{  
            "createdTime":"113",
            "postedBy":"userid_2"
         },
         "postid4":{  
            "createdTime":"114",
            "postedBy":"userid_1"
         }
      }
   }
}

我要检索“ userid_1”的以下用户的帖子,这些用户按创建时间按限制2排序(每个api调用2个帖子)。

如何在节点中进行火灾存储查询?

如果以下用户少于100位且他们有10条帖子,则可以提取以下所有用户的帖子并按创建时间对帖子进行排序。

如果用户有1000个关注者,而1000个用户有100个帖子,则无法按照创建的时间获取以下所有用户的帖子并进行排序。

我希望我们可以通过SQL“ JOIN”查询轻松实现这一目标

如何在节点的fire-store中实现此实现查询?

1 个答案:

答案 0 :(得分:0)

Firestore不具有服务器端JOIN的概念。一次读取操作中的所有文档都必须来自同一集合。

这意味着要从多个集合中获取数据,您将需要执行多个读取操作-每个集合至少一个,但可能还要更多。在大多数NoSQL数据库中,这都是正常现象,对于您应该从客户端应用程序读取的数据量来说,速度并不像许多开发人员所想的那么慢。

如果对于您的应用程序而言,您需要阅读的文档数量过多,请考虑更改数据模型以减少需要的阅读次数。通常,这意味着您最终会将某些数据复制为更易于阅读的格式。

例如,在您的用例中,您似乎有一个社交网络。常见的解决方案是为每个用户存储完整的提要,以便将他们关注的人的所有帖子作为单独的集合存储在数据库中。

因此,当用户撰写帖子时,您可以将该帖子写到主要的posts集合中,也写到该帖子的feed集合中跟随他们的每个用户。此操作称为扇出数据,虽然它使写入操作复杂并复制数据,但使读取数据的代码更简单,并且可伸缩性更高。由于在许多应用程序中读取操作比写入操作更为常见,因此许多NoSQL数据建模人员都认为这是一种有效的折衷。

这个主题范围之广,难以一justice而就,这就是为什么我还建议您:

相关问题