Firebase REST 流是否支持排序和过滤子节点?

Does Firebase REST streaming support ordering and filtering child nodes?

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

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

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

编辑

Frank 在下面的回答表明 Firebase 确实尊重您的查询参数。我遇到的问题仍然存在,我只是误解了发生的事情,因为情况变得有点复杂。我在 Frank 的 Firebase 中重现了我的问题,他非常友好地提供了这个问题的实例。

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

使用约束类型 == 1 开始流式查询:

$ curl -i -L -H "Accept: text/event-stream" 'https://Whosebug.firebaseio.com/29265457/.json?print=pretty&orderBy="type"&equalTo=1'

在一个单独的终端中,post 一个类型为==1 的新项目:

$ curl -X POST -H "Content-Type: application/json" -d '{"type": 1}' https://Whosebug.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://Whosebug.firebaseio.com/29265457/-JlY1nAmymCKw5lvLvMe.json

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

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

如果我再次将 "type" 设为 0,它就不会再出现在我的 curl 流终端中。如果我将 type 设为 1,那么它会在我的 curl 流中弹出(预期)。这是从 1->0 的过渡,我遇到了意外事件。

此外,使用 PATCH 而不是 PUT 来修改 "type" 似乎会在 curl 流中产生相同的行为。

我认为当我将一个值更改为不再匹配我的查询时,我会很自然地期望我不会在我的流中看到它。但是,看起来可能在编辑值之前匹配了查询,或者类似的东西......我不知道这是如何在 Firebase 端实现的。

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

这里有两点可能是错误的:

  1. 您没有在 myIndexedField
  2. 上定义索引
  3. 你的 URL 引用不正确

广告 1) 当您通过 (JavaScript/iOS/Java) 库访问 Firebase 时,如果您是 ordering/filtering 未编入索引的数据,它将回退到客户端排序和过滤。鉴于 REST API 没有附带客户端库,它无法执行这样的回退,它只会 return 数据 unordered/unfiltered.

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

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

我用这个 JavaScript 片段向它推送数据:

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

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