【问题标题】:Alternatives to Firebase query by value with arrays使用数组按值查询 Firebase 的替代方案
【发布时间】:2016-02-16 19:54:05
【问题描述】:

我试图弄清楚如何使用数组模拟按值查询,但是如果每个按值查询都是单独完成的,则数据会丢失其顺序,因此会出现问题。

假设数据库具有以下格式:

  • postID
    • 用户ID
    • 发布日期

在客户端,我有一组用户 ID: [id1, id2, id3]

我想按 datePosted 对 postID 进行排序,按值查询,其中 userID 等于数组中的 id 之一。然后我想查询前 5 个帖子。 因此,这应该得到这些用户最多 5 条最新帖子。

我了解到您无法使用数组按值查询,这意味着必须将每个用户 ID 分成单个查询(例如 firebase equivalent to sql where in () 建议)。但是,如果我这样做,我将不再能够按 datePosted 在来自不同用户的帖子之间正确排序,并且必须下载所有帖子才能排序并获得前 5 个。

本质上,我正在尝试完成: ref.queryOrderedByChild("datePosted").queryEqualToValue(array, "userID").queryLimitedToFirst(5)

以前有人遇到过这种问题吗?如有任何建议,将不胜感激!

【问题讨论】:

标签: firebase


【解决方案1】:

我假设您正在尝试模拟社交网络之类的东西,您可以在其中显示用户关注的人的帖子。如果是这样,我们就称那东西为“墙”吧。

您可以对此建模的一种方法:

posts
  -Kjas0273471234
    title: "Alternatives to Firebase query by value with arrays"
    body: "..."
    uid: "Flyte27"
    timestamp: 1455655809614
  -Kjas0281386734
    title: "An interesting data model"
    body: "..."
    uid: "puf"
    timestamp: 1455655909614
walls
  Flyte27
    -Kjas0273471234: 1455655809614
    -Kjas0281386734: 1455655909614

所以在这个模型中,你的墙上有你关注的人的帖子的键。我将值设置为时间戳,因为您可能希望按此排序。

现在使用这种结构,您可以查询和显示帖子:

ref.child('walls').child(auth.uid).orderByValue().on('value', function(keys) {
  keys.forEach(function(keySnapshot) {
    ref.child('posts').child(keySnapshot.key()).once('value', function(postSnapshot) {
      console.log(postSnapshot.val());
    });
  });
});

【讨论】:

  • 是的,非规范化数据绝对是一种解决方案,就像社交媒体风格的应用程序一样,用户可能有数百个朋友,这将导致后端大量重复,因为用户数量规模。虽然我想没有更好的选择?仍在习惯 Firebase 的工作方式。
  • 复制数据以加快读取速度。听起来像是经典的空间与时间权衡。它被称为扇出,在 NoSQL 中很常见:highscalability.com/blog/2013/7/8/…
  • 是的。我有点担心空间可扩展性,但这似乎是最好的方法。感谢您的回答!
猜你喜欢
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-01
  • 2014-12-15
  • 2012-03-12
  • 1970-01-01
  • 2015-08-23
相关资源
最近更新 更多