Firebase REST流媒体是否支持订购和过滤子节点?

时间:2015-03-25 20:03:47

标签: firebase

我想将更改流式传输到Firebase位置,但会根据对某个索引的查询过滤结果,如下所示:

curl -i -L -H "Accept: text/event-stream" https://mydata.firebaseio.com/path.json?'orderBy="myIndexedField"&equalTo="desiredValue"'

我观察到Firebase似乎忽略了我的查询,并继续将所有更改流式传输到该位置,无论它们是否与查询匹配。有没有办法做到这一点,除了编写代码来执行我自己的客户端过滤?

修改

Frank的回答显示,Firebase确实尊重您的查询参数。我仍然坚持的问题,我只是误解了正在发生的事情,因为情况变得有点复杂。我已经在弗兰克的Firebase中复制了我的问题,他非常友好地提供了这个问题的实例。

以下是重现我的问题的步骤:

使用约束类型== 1:

启动流式查询
$ curl -i -L -H "Accept: text/event-stream" 'https://stackoverflow.firebaseio.com/29265457/.json?print=pretty&orderBy="type"&equalTo=1'

在单独的终端中,发布类型为== 1的新项目:

$ curl -X POST -H "Content-Type: application/json" -d '{"type": 1}' https://stackoverflow.firebaseio.com/29265457/.json
{"name":"-JlY1nAmymCKw5lvLvMe"}

此对象按预期在我正在进行的curl流中弹出,因为它与type == 1的查询匹配:

event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":1}}}

现在,这是我误解为Firebase忽略查询的部分。如果我PUT该资源我刚刚发布并将其更改为type == 0,它仍会显示在我的流中!执行PUT:

$ curl -X PUT -H "Content-Type: application/json" -d '{"type": 0}' https://stackoverflow.firebaseio.com/29265457/-JlY1nAmymCKw5lvLvMe.json

这就是我在正在进行的流卷​​曲中弹出的内容:

event: patch
data: {"path":"/","data":{"-JlY1nAmymCKw5lvLvMe":{"type":0}}}

如果我PUT"输入"再次为0,它不再显示在我的curl流终端中。如果我将PUT键入1,那么它会在我的curl流中弹出(预期)。它是从1-> 0转换到我得到意外事件的地方。

此外,使用PATCH而不是PUT来修改"键入"似乎在curl流中导致相同的行为。

我认为当我将某个值更改为不匹配我的查询时,我很自然地会在我的流中看到它。但是,看起来可能在编辑值之前匹配查询,或者沿着这些行进行匹配......我不知道如何在Firebase端实现它。

所以我想新问题是:如何避免在REST流中看到与我的查询不匹配的更改值?

1 个答案:

答案 0 :(得分:0)

这里有两件事可能是错的:

  1. 您没有在myIndexedField
  2. 上定义索引
  3. 您的网址引用错误
  4. 广告1)当您通过(JavaScript / iOS / Java)库访问Firebase时,如果您要排序/过滤未编制索引的数据,它将回退到客户端排序和过滤。鉴于REST API没有附带客户端库,它无法执行这样的回退,它只会返回无序/未过滤的数据。

    广告2)您需要在整个网址周围放置单引号,而不仅仅是查询字符串。一个适合我的卷曲示例:

    curl -i -L -H "Accept: text/event-stream" 'https://stackoverflow.firebaseio.com/29265457/.json?orderBy="type"&equalTo=0'
    

    我使用此JavaScript代码段将数据推送到它:

    new Firebase('https://stackoverflow.firebaseio.com/29265457/').push({ type: 0 });
    

    它出现在卷曲窗口;或者如果我将类型设置为1则不会。