如何使用以下数据结构在firestore中获取文档?

时间:2018-05-12 20:43:58

标签: angular firebase ionic-framework collections google-cloud-firestore

我坚持在firestore中获取数据结构。我只能满足#1的要求。请帮助我。

要求:

  1. 显示最新的k个帖子,不论用户是什么(整个数据库中最新的k个帖子)

  2. 显示与多个用户相对应的帖子(与我关注的用户对应的帖子)

  3. 以下是我能想到的两种数据结构,但仍然无法满足第二项要求。

    数据结构1:

    /posts/{postId}/
                   -authorId          //one among /users/{userId}
                   -message
                   -date 
    /users/{userId}/
                   -name
                   -etc...
    

    Req1:显示最新的k个帖子,无论用户是什么

    constructor(private afs: AngularFirestore) {}
    
    // code to fetch latest k posts
    this.afs.collection("posts").ref
            .orderBy("date", "desc")
            .limit(k)
            .get().then(snapshot => {
                  snapshot.forEach(postDoc => {
                       console.log(postDoc.data());
                       // rest of the code
                  });
            });
    

    Req2:显示与多个用户对应的帖子 问题:在上面的代码中,如果我添加一个"其中"方法,它只能过滤一个authorId,而不能过滤多个。 例如

    this.afs.collection("posts").ref
            .where("authorId" == "xyz...")
            .orderBy("date", "desc")
            .limit(k)
    

    数据结构2:

    /users/{userId}/
                   -name
                   -etc...
                   /posts/{postId}/      (collection inside user document)
                                   -message
                                   -date 
    

    不确定,但我认为数据结构比数据结构1更有效,因为在查找与我关注的用户相对应的帖子时,不需要搜索整个帖子集合,而只是查看发布您正在关注的用户的收集。 问题:如何在上述数据结构中获取最新的k帖?

1 个答案:

答案 0 :(得分:0)

您应该毫不犹豫地在数据库中维护两个数据结构。这在NoSQL数据库中称为“非规范化”(通过反对众所周知的SQL DB规范化)是一种非常经典的方法。

看看这个解释NoSQL数据库的“数据建模技术”的article并说“非规范化可以定义为将相同数据复制到多个文档或表格以简化/优化查询处理以使用户的数据适合特定数据模型“。

缺点是您必须保持两个结构同步,但这可以通过Firestore中的批量写入轻松完成,请参阅此处的文档https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes