【问题标题】:Firebase sorting/filtering with keys nodeFirebase 使用键节点进行排序/过滤
【发布时间】:2017-07-10 04:40:22
【问题描述】:
{
"places": {
    "<push-key>": {
        "name": "Company X"
    },
    "<push-key>": {
        "name": "Restaurant Y"
    }
}
"stamps": {
    "<push-key>": {
        "value": 0,
        "date": 1487344650456
    }
},
"placeStamps": {
    "<place-push-key>": {
        "<stamp-push-key-1>": true,
        "<stamp-push-key-2>": true,
        "<stamp-push-key-3>": true
    }
}
}

我们是 Firebase 的新手,我们想知道是否有办法按日期对我们的图章(数据库中的节点)进行排序。我们的流程如下:

  • 我们使用places节点检索我们想要的地点。
  • 使用地点的密钥,我们从 placeStamps/ 节点检索戳记密钥。
  • 然后我们从 stamps 节点中一一检索邮票。

有没有办法通过例如“日期”或“值”对这些对象进行排序/过滤?我们无法在客户端执行此操作,因为我们正在谈论数百万张邮票。

【问题讨论】:

标签: javascript firebase firebase-realtime-database relationship nosql


【解决方案1】:

查询24小时前的邮票:

var ref = firebase.database.ref("stamps");
var now = Date.now();
var yesterday = now - 24 * 60 * 60 * 1000;
var query = ref.orderByChild("Date").startAt(yesterday);
query.on("child_added", function(snapshot) {
    console.log(snapshot.key);
});

如果您想通过时间戳检索某个地点的戳记,您有两种选择:

  • 检索该地点的戳记并在客户端按时间戳对它们进行排序。检索多个项目并不像您预期​​的那么慢,因为 Firebase 对请求进行管道传输。见Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly
  • 将时间戳添加到每个地点的戳记键中:

    placeStamps": {
      "<place-push-key>": {
        "<stamp-push-key-1>": 1487344650456,
        "<stamp-push-key-2>": 1487344650457,
        "<stamp-push-key-3>": 1487344650458
      }
    }
    

    现在您可以通过以下方式获取某个地点的时间戳:

    var ref = firebase.database.ref("placeStamps").child("<place-push-key>");
    var now = Date.now();
    var yesterday = now - 24 * 60 * 60 * 1000;
    var query = ref.orderByValue().startAt(yesterday);
    

【讨论】:

  • 但是当我只想过滤属于某个地方的邮票时,这将如何工作? stamps 节点可能充满了数百万条记录。一个接一个地检索所有这些记录不是很有效吗?
  • 一项一项地检索多个项目并不像您想象的那么慢。见stackoverflow.com/questions/35931526/…。我还用更多信息更新了我的答案。
  • 我明白了,但是如何过滤 stamps 节点,但只检索我的 place 键下 placeStamps 节点中的键项?
  • 但是如果你有一个多对多的关系,例如:一个用户有很多邮票,一个邮票属于一个或多个用户。一张邮票的日期会改变。然后我需要用日期更新每个带有戳记键的条目。 (可能有数百万条记录)。如何做到这一点?
  • 您所描述的内容被称为扇出数据,是 NoSQL 数据建模的基本步骤。我不久前在this answer 中介绍了它的方法。我还建议阅读NoSQL data modeling 和查看Firebase for SQL developers
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2011-08-09
  • 2010-11-19
相关资源
最近更新 更多