如何使用Firebase进行复杂查询?

时间:2017-06-12 19:04:13

标签: firebase web-applications firebase-realtime-database nosql

我正在Firebase中创建我的第一个应用。我没有使用NoSQL的经验,所以制定我的数据结构证明是一个挑战。假设我的应用程序类似Reddit,用户访问该站点并读/写帖子。我希望应用程序有一个列表视图,它以多种方式对帖子数据进行排序,但是它都以提交的日期帖子为中心:

视图

  1. 按降序显示最新帖子。
  2. 显示特定代码的最新帖子。
  3. 在最后一天(24小时)按降序显示最喜欢的帖子。
  4. 我假设数据结构看起来像这样:

    {
        "posts": {
            "post_0": {
                "content": "...",
                "created_at": 1497112445748,
                "likes": 100,
                "tags": {
                    "tag_0": true,
                    "tag_2": true
                }
            },
            "post_1": {
                "content": "...",
                "created_at": 1497112549374,
                "likes": 30,
                "tags": {
                    "tag_1": true
                }
            },
            "post_2": {
                "content": "...",
                "created_at": 1497112640376,
                "likes": 70,
                "tags": {
                    "tag_1": true,
                    "tag_2": true
                }
            },
            ...
        }
    }
    

    查看1

    这可能是最容易解决的问题。我想用于检索数据的脚本将是这样的:

    const ref = firebase.database().ref("posts");
    const query = ref.orderByChild("created_at").limitToLast(50);
    query.on("child_added", (snapshot) => {
        // Do stuff like add to array for sorting
    });
    

    查看2

    这是事情变得棘手的地方。由于每个查询只能有一个orderBy*,因此我可以看到解决此问题的唯一方法是使用标记节点复制日期和帖子ID。例如:

    {
        "tags": {
            "tag_2": {
                "post_0": {
                    "created_at": 1497112445748
                },
                "post_2": {
                    "created_at": 1497112640376,
                }
            },
            ...
        }
    }
    

    我已经读过这是非规范化的整个概念,并围绕您的观点构建数据,但是没有更好的方法吗?

    查看3

    我根本不知道如何解决这个问题。由于最后一天在每次请求视图时都在变化,并且喜欢的频繁变化,我怎样才能围绕此视图构建数据?

    我已经读过推送密钥,它取代了我在我的示例中使用的post_n密钥,是顺序的,可以在某种程度上依赖于时间戳。我不确定是否有某种方法可以利用它。

    我在Firebase团队发现了一些有用的视频和关于Medium的文章,但我担心他们还不够了解我如何完成应用程序的需求。

    我只是发现Firebase的这个方面真的让我感到困惑,因为它让我的视图返回我需要的数据。

    如果有人能为我提供如何完成这些事情的例子,我将不胜感激!谢谢!

0 个答案:

没有答案